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
.