2016-02-11 68 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

不客气。 –