2012-04-16 2 views
1

Моя цель - добавить новый набор записей продуктов в существующий ассоциативный массив, но каждый продукт будет представлен только один раз. Я написал функцию ниже. Похоже, слишком много кода для чего-то такого простого. Есть ли функция массива PHP, о которой мне нужно узнать?Добавить в ассоциативный массив - но без дубликатов

function _append (&$already, $addition) { 
    while($result = mysql_fetch_array($addition)) { 
     $already_found = FALSE; 
     foreach ($already as $try) { 
      if ($try["products_id"] == $result["products_id"]) { 
       $already_found = TRUE; 
       break; 
      } 
     } 
     if (!$already_found) { $already[] = $result; } 
    } 
} 

ответ

2

Используйте идентификатор продукта в качестве ключа, как $already[$result['products_id']] = $result;, а затем вы можете использовать array_key_exists проверить идентификатор продукта легко против всех существующих продуктов. (Или, не надо. В любом случае у вас будет только один продукт на идентификатор, если вы не проверите, последний дубликат перезапишет ранее.)

В любом случае, вы полностью избавитесь от foreach ,

function _append(&$already, $addition) { 
    while ($result = mysql_fetch_array($addition)) { 
     if (!array_key_exists($result['products_id'], $already)) { 
      $already[$result['products_id']] = $result; 
     } 
    } 
} 

Улов, ваш массив больше не индексируется цифрой. Куда бы вы добавляли в него элементы, вы добавляете их своим ключом (значение products_id). Но вы можете сказать foreach ($items as $item), как всегда.

+0

Я использую ассоциативный массив, поэтому $ item ['product_id'] не является ключом. Я не уверен, как применить ваш ответ. – Smandoli

+0

Вы используете ассоциативный массив для каждого элемента, но '$ уже ', по-видимому, численно проиндексирован. И, как я понимаю, поле 'products_id' * является * ключом; ваше полное определение «дубликат» состоит в том, что эти два матча. Если вы меняете вещи так, что используете товар product_id как ключ ... а. Лемм прав. – cHao

+0

Спасибо за редактирование. Мне нужна была помощь. :-p – Smandoli

1

Как насчет назначения идентификатора продукта в качестве ключа массива в $already?

while($result = mysql_fetch_array($addition)) { 
    $already[$result['products_id']] = $result; 
} 

Это, конечно же, перезаписывает старую запись продукта, но она должна изящно избегать дубликатов!

+0

Так что измените его на многомерный массив, верно? Я мог бы это сделать, но мое текущее решение действительно работает, и ассоциативный массив очень удобен. – Smandoli

+0

Все, что вы делаете, это переключение с PHP-ключей на те, которые вы указываете сами. @cHao объясняет это красиво выше. – rjz

+0

Спасибо, я вижу, что ваш ответ согласен. Однако мне понадобилось дополнительное объяснение! И мне также нужна была функция, чтобы не перезаписывать существующую запись. – Smandoli