2016-02-11 70 views
0

我不知道爲什麼,但我有一個代碼檢查數組,看它是否有值insde數組已經。這隻能保存一次數組。下面是代碼:使用in_array爲數組中的值與鍵名

$categoryatributesarray = []; 

$categoryarray['type_name'] = 'NA'; 
$categoryarray['type_id'] = 'NA'; 
$categoryarray['value_name'] = 'NA'; 
$categoryarray['value_id'] = 'NA'; 
$categoryarray['shopify_type'] = 'NA'; 
array_push($categoryatributesarray, $categoryarray); 

foreach ($CategoriesMerging as $key => $value) { 
    if (empty($value['CategoriesMerging']['category_id'])) { 
     $this->redirect('/product_mercado_libres/categoryMerging'); 
     return false; 
    } 
    $categoryatributes = $meli->get('/categories/' . $value['CategoriesMerging']['category_id'] . '/attributes'); 
    if (!empty($categoryatributes['body'])) { 
     foreach ($categoryatributes['body'] as $key1 => $value1) { 
      foreach ($value1->values as $key2 => $value2) { 
       if (!in_array($value2->id, $categoryatributesarray)) { 
        $categoryarray['type_name'] = $value1->name; 
        $categoryarray['type_id'] = $value1->id; 
        $categoryarray['value_name'] = $value2->name; 
        $categoryarray['value_id'] = $value2->id; 
        $categoryarray['shopify_type'] = $value['CategoriesMerging']['type']; 
        array_push($categoryatributesarray, $categoryarray); 
       } 
      } 
     } 

    } 

} 

echo '<pre>'; 
echo print_r($categoryatributesarray); 
echo '</pre>'; 

它給了我和陣列什麼是尋找到是下一個:

Array 
(
    [0] => Array 
     (
      [type_name] => NA 
      [type_id] => NA 
      [value_name] => NA 
      [value_id] => NA 
      [shopify_type] => NA 
     ) 

    [1] => Array 
     (
      [type_name] => Talle 
      [type_id] => 30000 
      [value_name] => 0-3 M 
      [value_id] => 5f95725 
      [shopify_type] => Conjuntos 
     ) 

    [2] => Array 
     (
      [type_name] => Talle 
      [type_id] => 30000 
      [value_name] => 3-6 M 
      [value_id] => ccbd9f4 
      [shopify_type] => Conjuntos 
     ) 
..... 
) 

什麼進出口尋找對於value_id不要在同一陣列中來了2倍我打印。

+1

如果您希望'$ categoryatributesarray'數組在'value_id'上是唯一的,那麼在構建'$ categoryatributesarray'時可以使用'value_id'作爲數組鍵。 –

+0

這是一個很好的解決方法:P現在就用你的想法。但我想知道爲什麼我建立它的方式不起作用。我需要在in_array上更改它才能工作D: –

回答

1

的問題

if (!in_array($value2->id, $categoryatributesarray)) { ... 

$value2->id總是包含一個字符串,$categoryatributesarray只包含陣列,使in_array永遠不會返回true。 in_array只比較「針」與「乾草堆」頂層的值;這不是一個遞歸搜索。

$value2->idid列的$categoryatributesarray進行比較的方法有多種。如果你有PHP 5.5+,你可以使用

if (!in_array($value2->id, array_column($categoryatributesarray, 'id'))) { ... 

array_column結果將是所有在$categoryatributesarray陣列的id屬性的列表。

如果你的PHP版本是5.5 <,你可以使用array_filter代替

$id = $value2->id; 
$match = array_filter($categoryatributesarray, 
    function($x) use ($id) { return $x->id == $id; }); 
if (!$match) { 

我不知道,如果這些都做到這一點,「最佳途徑」。他們只是我想到的第一個。

正如我在評論中提到的,雖然我真的認爲這兩種方法中的任何一種都不如在構建它時使用id作爲$categoryatributesarray中的數組鍵。使用這些方法之一,每次添加元素時都會搜索整個數組,並且添加的元素越多,搜索的數組就越多。

+0

我沒有想過一次又一次地通過陣列運行的程序。感謝其他兩種選擇:D我使用ID作爲你首先給予我的關鍵思想。再次感謝您的幫助:D –

+0

不客氣。 –