为什么这些foreach和for循环会产生不同的输出?

时间:2018-04-14 10:02:59

标签: php loops for-loop foreach

$value = 1234;
$number_array = str_split($value);

for($i = 0; $i < sizeof($number_array); $i++) {
  $number_array[$i] *= 10;
} 
// output: 10, 20, 30, 40. 

foreach($number_array as &$value) {
  $value *= 10;
} 
// output: 10, 20, 30, 30.

有人可以解释为什么for循环会给出所需的结果,但是foreach没有?

4 个答案:

答案 0 :(得分:1)

因为for循环会更改$number_array

的值

这样做会得到相同的结果

    $value = 1234;
    $number_array = str_split($value);

    foreach($number_array as $value) {
       $value *= 10;
       echo $value;
       // output: 10, 20, 30, 40.
    } 


    for($i = 0; $i < sizeof($number_array); $i++) {
      $number_array[$i] *= 10;
    } 
    // output: 10, 20, 30, 40. 
    print_r($number_array);

答案 1 :(得分:0)

以下是var_dump的结果:

for($i = 0; $i < sizeof($number_array); $i++) {
  $number_array[$i] *= 10;
  var_dump($number_array[$i]);
} 
// output: int(10) int(20) int(30) int(40)

foreach($number_array as &$value) {
  $value *= 10;
  var_dump($value);
} 
// output: int(100) int(200) int(300) int(400)

输出是不同的,因为你在第一个循环中为每个变量分配了它们的乘法值,然后在第二个循环中再次执行它。

如果您使用相同的值单独调用它们,它们将执行相同的输出。

答案 2 :(得分:0)

如果单独调用它,这两个循环的结果完全相同。但是在第一个循环中,您正在更改 $ number_array 。在第一次循环之前,它的值是[1,2,3,4],之后是[10,20,30,40]。

看看:

$value = 1234;
$number_array = str_split($value);



for($i = 0; $i < sizeof($number_array); $i++) {
  $number_array[$i] *= 10;
} 

var_dump($number_array); // 10, 20, 30, 40 

foreach($number_array as &$value) {
  $value *= 10;
}

P.S 如果您想为每个循环获得相同的结果,请更改您的代码:

$value = 1234;
$number_array = str_split($value);



for($i = 0; $i < sizeof($number_array); $i++) {
   $x = $number_array[$i];
   $x  *= 10;

    echo $x."</br>";
} 
echo "---</br>";


foreach($number_array as &$value) {
  $value *= 10;
    echo $value."</br>";
} 

注意:不要将值更改为数组,而是将其写入$x变量并更改

答案 3 :(得分:0)

原来我用来创建字符串的循环导致输出不正确,因为我在字符串的foreach循环中再次使用$value

$value = 1234;
$number_array = str_split($value);

foreach($number_array as &$value) {
  $value *= 10;
} 
foreach($number as $value) {
  $answr .= $value . " ";
} 
// $answr = 10 20 30 30

我将循环更改为$num进行测试后,打印出正确的输出。

foreach($number as $num) {
  $answr .= $num . " ";
} //$answr: 10 20 30 40

一个不正常的怪癖,我还没有完全理解,但我假设它是因为$value在第二个foreach循环期间仍被设置为var。

感谢您的所有答案,我为不发布整个代码段并造成混淆而道歉。