2013-02-12 329 views
1

这让我疯狂。我已经验证了我的输入/输出,并且我仍然收到意想不到的行为。它应该是2,但它是在做numa numa。我错过了什么?PHP foreach循环

输入:

data 
Array 
(
    [0] => Array 
     (
      [lineId] => 1 
      [quantity] => 2 
      [costPerItem] => 16.585 
      [itemId] => 1 
     ) 

) 

代码:

printr($data, 'data'); 
foreach($data as $i => $value){ 
    foreach($value as $key => $a){ 
     echo 'key: '.$key.' - a: '.$a.'<br />'; 
     ($key == 'quantity') ? $dataQuantity[$i] = $a : $dataQuantity[$i] = 'numanuma'; 
    } 
} 
printr($dataQuantity, 'data quantity'); 

输出:

key: lineId - a: 1 
key: quantity - a: 2 
key: costPerItem - a: 16.585 
key: itemId - a: 1 

data quantity 
Array 
(
    [0] => numanuma 
) 
+0

我没有看到你的代码中的任何'break'声明。 – 2013-02-12 18:33:15

+0

我不打破这里的foreach循环,我不应该这样做。我尝试修改代码以修饰代码。 – phpmeh 2013-02-12 18:34:00

+0

+1为numanuma – Nick 2013-02-12 18:53:54

回答

2

有一个不对的几件事情。

首先,您在子循环中设置值$dataQuantity[$i],但$i在外循环中递增。

当你的代码看“量”可能设置$dataQuantity[$i]2,但随后看到itemId和覆盖$dataQuantity[$i]因为$i没有改变。

其次,你应该将三元改变,如果语句是:

$dataQuantity[$i] = ($key == 'quantity') ? $a : 'numanuma'; 

这并不是什么我前面提到因素。

这里的工作示例:

printr($data, 'data'); 
foreach($data as $i => $value){ 
    foreach($value as $key => $a){ 
     if ($key == 'quantity') { 
      $dataQuantity[$i] = $a; 
      break; 
     } 
    } 
} 
printr($dataQuantity, 'data quantity'); 
2

分配 “numanuma” 如果键不是“数量”。在“数量”键之后,一些键的数量是而不是,因此“numanuma”分配的值为$a

简短的回答,添加额外的检查和标志,检查是否$dataQuantity[$i]已经被正确地分配“numanuma”前分配。

3

这是因为关键itemId在数量键之后。所以它被设置为2,但是在设置为numanuma之后的循环。

试试这个:

printr($data, 'data'); 
foreach($data as $i => $value){ 
    foreach($value as $key => $a){ 
     echo 'key: '.$key.' - a: '.$a.'<br />'; 
     if($key == 'quantity') 
     { 
      $dataQuantity[$i] = $a; 
     } 
    } 
} 
printr($dataQuantity, 'data quantity'); 
+0

哇,我添加了三元试图调试,这是一个愚蠢的错误。谢谢。 – phpmeh 2013-02-12 18:38:04

0

三元操作符不用于分配值,请仔细阅读本:

注:请注意三元运算符是个语句,它不评估到一个变量,但对 声明的结果。这对了解您是否想通过引用返回变量 很重要。该语句返回$ var == 42? $ a:$ b;因此 通过引用返回函数将不起作用,并在稍后的PHP版本中发出警告 。

Source