Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 60 additions & 96 deletions language/control-structures/for.xml
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: e674990649cd2b111b8dd1175a7a1befcc621635 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 8c273ad6577a6b4d6d3adea73502a4516ca2fe0c Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->

<sect1 xml:id="control-structures.for" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>for</title>
<?phpdoc print-version-for="for"?>
<para>
Las bucles <literal>for</literal> son las más complejas en PHP.
Funcionan como las bucles for del lenguaje C(C++).
La sintaxis de las bucles <literal>for</literal> es la siguiente :
Los bucles <literal>for</literal> son los más complejos en PHP.
Funcionan como los bucles for del lenguaje C.
La sintaxis de los bucles <literal>for</literal> es la siguiente:
<informalexample>
<programlisting>
<![CDATA[
Expand All @@ -21,38 +21,38 @@ for (expr1; expr2; expr3)
</para>
<simpara>
La primera expresión (<varname>expr1</varname>) es
evaluada (ejecutada), en cualquier caso al
inicio de la bucle.
evaluada (ejecutada) una sola vez, sin condición, al
inicio del bucle.
</simpara>
<simpara>
Al inicio de cada iteración, la expresión
<varname>expr2</varname> es evaluada.
Si la evaluación es &true;, la bucle
Si la evaluación es &true;, el bucle
continúa y los comandos son ejecutados. Si
la evaluación es &false;,
la ejecución de la bucle se detiene.
la ejecución del bucle se detiene.
</simpara>
<simpara>
Al final de cada iteración, la expresión
<varname>expr3</varname> es evaluada
(ejecutada).
</simpara>
<simpara>
Las expresiones pueden eventualmente ser
dejadas vacías o pueden contener varias expresiones separadas por comas.
Cada una de las expresiones puede estar
vacía o puede contener varias expresiones separadas por comas.
En <varname>expr2</varname>, todas las expresiones separadas por una coma
son evaluadas pero el resultado se obtiene desde la última parte.
Si la expresión <varname>expr2</varname>
es dejada vacía, esto significa que es una bucle infinita
es dejada vacía, esto significa que es un bucle infinito
(PHP considera implícitamente que vale &true;,
como en C). Esto no es realmente muy útil, a menos que se desee terminar la bucle con la
instrucción condicional
como en C). Esto puede ser menos inútil de lo que parece, ya que a menudo se
desea terminar el bucle con una instrucción condicional
<link linkend="control-structures.break"><literal>break</literal></link>
en lugar de la expresión <literal>for</literal>.
en lugar de usar la expresión de verdad del <literal>for</literal>.
</simpara>
<para>
Considérese los siguientes ejemplos. Todos muestran los números enteros de
1 a 10 :
Considérense los siguientes ejemplos. Todos muestran los números enteros de
1 a 10:
<informalexample>
<programlisting role="php">
<![CDATA[
Expand Down Expand Up @@ -126,12 +126,12 @@ for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i . " ", $i++);
</para>
<simpara>
Por supuesto, el primer ejemplo es el más simple
de todos (o quizás el cuarto), pero también se puede pensar que usar una expresión vacía en una
de todos (o quizás el cuarto), pero también se puede pensar que usar una expresión vacía en un
bucle <literal>for</literal> puede ser útil a veces.
</simpara>
<para>
PHP también soporta la siguiente sintaxis alternativa para las bucles
<literal>for</literal> :
PHP también soporta la siguiente sintaxis alternativa para los bucles
<literal>for</literal>:
<informalexample>
<programlisting>
<![CDATA[
Expand All @@ -144,97 +144,61 @@ endfor;
</informalexample>
</para>
<simpara>
Muchas personas tienen la costumbre de iterar a través de arrays, como en
el ejemplo a continuación.
Las expresiones <varname>expr2</varname> y <varname>expr3</varname> se
evalúan en cada iteración. Es aconsejable usar expresiones simples en estos
lugares para evitar problemas de rendimiento. Por ejemplo, si el número de
iteraciones se conoce de antemano, es mejor usar una variable en lugar de una
llamada a función en <varname>expr2</varname>:
</simpara>
<para>
<informalexample>
<programlisting role="php">
<programlisting role="php" annotations="non-interactive">
<![CDATA[
<?php
/*
* Este es un array con datos que queremos modificar
* a lo largo de la bucle
*/
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);

for($i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = random_int(100000, 999999);
$people = ['Kalle', 'Pierre'];

// Mala práctica: llamar a una función en cada iteración
for($i = 0; $i < getIterationCount($people); ++$i) {
$people[$i] .= ' es genial';
}
var_dump($people);
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
array(2) {
[0]=>
array(2) {
["name"]=>
string(5) "Kalle"
["salt"]=>
int(454478)
}
[1]=>
array(2) {
["name"]=>
string(6) "Pierre"
["salt"]=>
int(776978)
}

// Buena práctica: almacenar el número en una variable
for($i = 0, $peopleCount = getIterationCount($people); $i < $peopleCount; ++$i) {
$people[$i] .= ' es genial';
}

]]>
</screen>
</programlisting>
</informalexample>
</para>
<simpara>
Este código puede ser lento porque debe calcular el tamaño del array en cada
iteración. Dado que el tamaño nunca cambia, puede ser fácilmente optimizado utilizando una variable intermedia para almacenar el tamaño en lugar de
llamar repetidamente a la función <function>count</function> :

En el ejemplo anterior, la función se llama en cada iteración del primer
bucle, aunque siempre devuelve el mismo valor. Almacenar ese valor en una
variable, como hace el segundo bucle, llama a la función una sola vez. Tenga
en cuenta que el número de iteraciones queda entonces fijado: si el array se
modifica dentro del bucle, el valor almacenado ya no refleja su tamaño.
</simpara>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);

for($i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = random_int(100000, 999999);
}
var_dump($people);
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
array(2) {
[0]=>
array(2) {
["name"]=>
string(5) "Kalle"
["salt"]=>
int(454478)
}
[1]=>
array(2) {
["name"]=>
string(6) "Pierre"
["salt"]=>
int(776978)
}
}
]]>
</screen>
</informalexample>
</para>
<note>
<simpara>
El tamaño de un <type>array</type> se almacena junto con el array, lo que
significa que llamar a la función nativa <function>count</function> no
requiere contar los elementos y no provoca problemas de rendimiento. Esto no
se aplica a <constant>COUNT_RECURSIVE</constant>, que recorre todo el array.
También hay que tener cuidado al usar <function>count</function> sobre
objetos que implementan <interfacename>Countable</interfacename>, ya que
tales llamadas pueden ser más costosas.
</simpara>
</note>

<note>
<simpara>
El bucle <literal>for</literal> no es la forma recomendada de iterar sobre
arrays. El bucle &foreach; está diseñado específicamente para este propósito
y suele ser más cómodo.
</simpara>
</note>
</sect1>

<!-- Keep this comment at the end of the file
Expand Down