2016-02-11 1 views
0

Я не знаю, почему, но у меня был код, который проверил массив, чтобы узнать, было ли оно уже значением массива. Это позволит сохранить массив только один раз. Вот код:Использование 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 
     ) 
..... 
) 

Что Im ищет это для value_id не прийти 2 раза в одном массиве Im печать.

+1

Если вы хотите, чтобы массив '$ categoryatributesarray' был уникальным в' value_id', вы можете использовать 'value_id' в качестве ключа массива при создании' $ categoryatributesarray'. –

+0

Это приятное обходное решение: на данный момент я использую вашу идею. Но я хотел бы знать, почему способ, которым он строится, не работает. Что мне нужно изменить на in_array, чтобы он работал? D: –

ответ

1

Проблема с

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

$value2->id что всегда содержит строку, и $categoryatributesarray содержит только массивы, так что in_array никогда не возвращает истину. in_array сравнивает «иглу» с значениями на верхнем уровне «стога сена»; это не рекурсивный поиск.

Можно сравнить $value2->id с колонкой id от $categoryatributesarray. Если у вас есть PHP 5.5+, вы можете использовать

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

результатом array_column будет список всех id атрибутов массивов в $categoryatributesarray.

Если ваш 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 Ill использовать id как ключевую идею, которую вы мне дали сначала. Еще раз спасибо за вашу помощь: D –

+0

Добро пожаловать. –

Смежные вопросы