У меня есть массив в PHP, который выглядит так:
[0]=> array(2) { ["name"]=> string(9) "My_item" ["url"]=> string(24) "http://www.my-url.com/" } [1]=> array(2) { ["name"]=> string(9) "My_item" ["url"]=> string(24) "http://www.my-url2.com/" }
Два значения в «имени» одинаковы в этих двух элементах. Я хочу сортировать дубликаты, как это.
Как создать уникальный массив, указав значение «name»?
в основном
foreach($your_array as $element) { $hash = $element[field-that-should-be-unique]; $unique_array[$hash] = $element; }
Сериализация очень полезна для упрощения процесса установления уникальности иерархического массива. Используйте этот один вкладыш для извлечения массива, содержащего только уникальные элементы.
$unique = array_map("unserialize", array_unique(array_map("serialize", $input)));
Пожалуйста, найдите эту ссылку полезной, используйте хеш md5 для проверки дубликатов:
http://www.phpdevblog.net/2009/01/using-array-unique-with-multidimensional-arrays.html
Быстрый взгляд:
/** * Create Unique Arrays using an md5 hash * * @param array $array * @return array */ function arrayUnique($array, $preserveKeys = false) { // Unique Array for return $arrayRewrite = array(); // Array with the md5 hashes $arrayHashes = array(); foreach($array as $key => $item) { // Serialize the current element and create a md5 hash $hash = md5(serialize($item)); // If the md5 didn't come up yet, add the element to // to arrayRewrite, otherwise drop it if (!isset($arrayHashes[$hash])) { // Save the current element hash $arrayHashes[$hash] = $hash; // Add element to the unique Array if ($preserveKeys) { $arrayRewrite[$key] = $item; } else { $arrayRewrite[] = $item; } } } return $arrayRewrite; } $uniqueArray = arrayUnique($array); var_dump($uniqueArray);
См. Рабочий пример здесь: http://codepad.org/9nCJwsvg
Посмотрите на функцию PHP-ARRAY-UNIQUE .
Простое решение:
/** * @param $array * @param null $key * @return array */ public static function unique($array,$key = null){ if(null === $key){ return array_unique($array); } $keys=[]; $ret = []; foreach($array as $elem){ $arrayKey = (is_array($elem))?$elem[$key]:$elem->$key; if(in_array($arrayKey,$keys)){ continue; } $ret[] = $elem; array_push($keys,$arrayKey); } return $ret; }
Учитывая, что ключи массива (0,1) не кажутся значительными, простым решением было бы использовать значение элемента, на которое ссылается «имя» в качестве ключа для внешнего массива:
["My_item"]=> array(2) { ["name"]=> string(9) "My_item" ["url"]=> string(24) "http://www.my-url.com/" }
… и если есть только одно значение, отличное от «имени», то зачем вообще входить в вложенный массив?
["My_item"]=>"http://www.my-url.com/"