2012-11-05 23 views
0

我似乎無法從以下的foreach代碼中得到任何結果。我似乎無法遞歸地運行數組,我不能讓這個數組的更小的數組。我只想從數組中挑選數據並將數據放在更小的數組中。使用foreach搜索php數組的特定值

PHP代碼

$ii = 0; 
foreach ($array as $key => $value) 
     { 
     $vv = $value; 
     if($vv== 'Alpha') 
      { 
     $ii++; 
      $list[$ii]['info'] = $vv; // my new array 
     } 
     } 

PHP的print_r($陣列)

Array 
(
[0] => Array 
    (
     [moredetails] => Array 
      (
       [moredetails] => Array 
        (
         [0] => Array 
          (
           [productId] => 9999 
           [productName] => Name 
           [productType] => Alpha 
           [serialNumber] => 
           [serviceItemId] => 123456         
          ) 

         [1] => Array 
          (


           [productId] => 8888 
           [productName] => Name 
           [productType] => Beta 
           [serialNumber] => 
           [serviceItemId] => 123456         
          ) 
        ) 
      ) 
    ) 
)  

理想的結果

Array 
(
    [0] 
    (
    [productID] => 9999 
    [productName] => Name 
    {productType] => Alpha 
    ) 
) 

發現的解決方案!

function miniArray($array, &$simple, $ii) 
{ 
    foreach($array as $key => $value) 
    { 

     if(is_array($value)){    
     $ii++; 
      miniArray($value, $simple, $ii); 
     } 
     else 
     { 
     $simple[$ii][$key] = $value; 

    } 

    } 
} 

miniArray($service, $simple_array, 0); 
+1

'foreach'不會遞歸地通過數組循環。你必須爲此寫一個自定義函數。 – sgroves

+0

這很有道理,爲什麼我沒有得到任何結果。沒有內置的PHP函數可以循環使用多個暗淡的數組? – Brutnus

+0

不是真的,但如果您在array_key_exists,array_search等網頁上查看PHP手冊,則可以從中選擇多個遞歸數組搜索函數。 – adeneo

回答

1
<?php 
    function miniArray($array, &$simple) 
    { 
     foreach($array as $key => $value) 
     { 
      if(is_array($value)) 
       miniArray($value, $simple); 
      else 
       $simple[] = $value; 
     } 
    } 

    miniArray($complex_array, $simple_array); 
?> 
+0

我編輯了我的問題,但您的答案是我用來創建我的功能!萬分感謝! – Brutnus

+0

您不必將$ ii作爲參數。 '$ simple [] = $ value;'sintax將'$ value'添加到'$ simple'中的下一個可用索引。例如:它首次執行時,它會被解釋爲'$ simple [0] = $ value;'。第二次是'$ simple [1] = $ value;'等等。 –

+0

除非您將數組存儲在索引中,而索引是它們被發現的深度。如果是這樣,請忽略此。 –

1

foreach將只經過所述陣列的外層。在第一個循環中,$key將是0$value將是一個數組 - 它永遠不會匹配'Alpha'

你會想要的是一個遞歸函數。 PHP爲我們提供了一個不錯的快捷方式,它可以讓你提供自己的函數,遞歸地應用於每個元素。

$list = array(); //your new array 

function walker($value, $key) { 
    if ($value == 'Alpha') $list[] = $value; 
} 

array_walk_recursive($array, 'walker'); //$array is your original array 
+0

這看起來不錯。如果將$ product =='Alpha'添加到$ list [],我將如何添加productid,productname? – Brutnus

+0

嗯,如果這就是你所需要的,那麼仔細看看,'array_walk_recursive'並不是你最需要的。對不起這是我的錯。根據手冊的說法,「任何保存數組的鍵都不會被傳遞給函數」,所以似乎沒有辦法將正確的值鏈接在一起。最好還是使用自定義遞歸,更多的是@F @ ron的行。 – Rick