удалить дубликаты из массива (массив unic по ключу)

Array ( [0] => Array ( [file] => /var/websites/example.com/assets/images/200px/1419050406e6648e1c766551a0ffc91380fd6ff3406002011-10-233750.jpg [md5] => 42479bee7a304d2318250de2ef1962a9 [url] => http://example.com/assets/images/200px/1419050406e6648e1c766551a0ffc91380fd6ff3406002011-10-233750.jpg ) [1] => Array ( [file] => /var/websites/example.com/assets/images/200px/21277792606e6648e1c766551a0ffc91380fd6ff3406002011-10-233750.jpg [md5] => 42479bee7a304d2318250de2ef1962a9 [url] => http://example.com/assets/images/200px/21277792606e6648e1c766551a0ffc91380fd6ff3406002011-10-233750.jpg ) ) 

Как удалить дубликаты ключей md5 из вышеуказанного массива?

 <?php $data = array( array( 'md5' => 'alpha', 'some' => 'value', ), array( 'md5' => 'alpha', 'some' => 'other value', ), array( 'md5' => 'bravo', 'some' => 'third value', ), ); // walk input array $_data = array(); foreach ($data as $v) { if (isset($_data[$v['md5']])) { // found duplicate continue; } // remember unique item $_data[$v['md5']] = $v; } // if you need a zero-based array, otheriwse work with $_data $data = array_values($_data); 

PHP уже имеет функцию для удаления повторяющихся элементов из массива. Но, к сожалению, array_unique поддерживает только сравнения на основе строк:

Примечание. Два элемента считаются равными тогда и только тогда, когда (string) $elem1 === (string) $elem2 . В словах: когда строковое представление одно и то же. Будет использоваться первый элемент.

Проблема в том, что любой массив, преобразованный в строку , равен любому другому массиву:

Массивы всегда преобразуются в строку « Array »; […]

Но вы можете использовать уникальность ключей массива, чтобы решить эту проблему:

 $index = array(); foreach ($arr as $key => $item) { if (isset($index[$item['md5']])) { unset($item[$key]); } $index[$item['md5']] = TRUE; } с $index = array(); foreach ($arr as $key => $item) { if (isset($index[$item['md5']])) { unset($item[$key]); } $index[$item['md5']] = TRUE; } 

Вот моя последняя функция после вашей помощи. Надеюсь, это поможет кому-то в будущем …

  $data = array( array( 'md5' => 'alpha', 'some' => 'value', ), array( 'md5' => 'alpha', 'some' => 'other value', ), array( 'md5' => 'bravo', 'some' => 'third value', ), ); // walk input array function remove_duplicateKeys($key,$data){ $_data = array(); foreach ($data as $v) { if (isset($_data[$v[$key]])) { // found duplicate continue; } // remember unique item $_data[$v[$key]] = $v; } // if you need a zero-based array, otheriwse work with $_data $data = array_values($_data); return $data; } $my_array = remove_duplicateKeys("md5",$data); 
 // your array $array = array(...); // will be used to store md5 hashes $md5 = array(); // walk through array foreach ($array as $key => $arr) { // have we already seen this md5 hash? if (in_array($arr['md5'], $md5)){ // remove element unset($array[$key]); }else { // keep element, but add it's md5 $md5[] = $arr['md5']; } } с // your array $array = array(...); // will be used to store md5 hashes $md5 = array(); // walk through array foreach ($array as $key => $arr) { // have we already seen this md5 hash? if (in_array($arr['md5'], $md5)){ // remove element unset($array[$key]); }else { // keep element, but add it's md5 $md5[] = $arr['md5']; } } 

Поскольку array_unique работает на плоских массивах, вы не можете использовать его напрямую. Но вы можете array_intersect_key все значения 'md5' в плоский массив, уникальный его, а затем получить элементы с помощью array_intersect_key :

 $allMd5s = array_map(function($v) {return $v['md5'];}, $array); $uniqueMd5s = array_unique($md5); $result = array_intersect_key($arr, $uniqueMd5s); 

Используйте array_filter () . Быстрый тест кода (не обязательно отражает вашу ситуацию, но вы должны получить эту идею):

 <?php header('Content-Type: Text/Plain'); $array = array( 0 => array('name' => 'samson'), 1 => array('name' => 'delilah'), 2 => array('name' => 'samson'), 3 => array('name' => 'goliath'), ); $md5Processed = array(); $newArray = array_filter($array, "uniqueMD5"); print_r($newArray); exit; function uniqueMD5( $data ){ global $md5Processed; if( !in_array( $data['name'], $md5Processed ) ) { $md5Processed[] = $data['name']; return true; } } 

Взгляните на функцию array_unique .