2013-02-12 160 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