У меня есть массив ассоциативных массивов
aa [] = ('Tires' => 100, 'Oil' => 10, 'Spark Plugs' => 4); aa [] = («Шины» => 454, «Масло» => 43, «Свечи искры» => 3); aa [] = ('Tires' => 34, 'Oil' => 55, 'Spark Plugs' => 44); aa [] = («Шины» => 454, «Масло» => 43, «Свечи искры» => 45); aa [] = ('Tires' => 34, 'Oil' => 55, 'Spark Plugs' => 433); aa [] = ('Tires' => 23, 'Oil' => 33, 'Spark Plugs' => 44);
Два вопроса
Как я могу удалить дубликаты в соответствии с полем «Масло», есть ли массив_unique, который я могу предоставить обратный вызов, который действует как пользовательский компаратор?
Как я могу сортировать по настраиваемому полю «Spark Plugs»
Я не знаю, какую функцию вы можете использовать для этого. Вам нужно будет сделать foreach над значениями массива и выполнить проверку уникальности вручную.
Используйте функцию usort () и создайте собственный компаратор.
Вместо того, чтобы вручную выполнять обычную проверку дубликатов, я сделал это
$ aa2 = array () foeach ($ aa as $ key => $ value) { $ aa2 [$ value ['Oil']] = $ value; } $ aa = $ aa2;
Затем сортировка была выполнена с помощью ключа …
Что касается вопроса 1, я думаю, что array_filter – это то, что вам нужно.
И, как говорит Брайан, уволите свой второй вопрос.
Проблема с удалением обмана таким образом, как вы определяете, какие значения остаются, поскольку вы говорите о частичной уникальности.
Это решение ниже просто удерживает первое место в индексном порядке. Это не совсем элегантный, но он работает.
<?php $aa = array(); $aa[] = array('Tires'=>100, 'Oil'=>10, 'Spark Plugs'=>4 ); $aa[] = array('Tires'=>454, 'Oil'=>43, 'Spark Plugs'=>3 ); $aa[] = array('Tires'=>34, 'Oil'=>55, 'Spark Plugs'=>44 ); $aa[] = array('Tires'=>454, 'Oil'=>43, 'Spark Plugs'=>45 ); $aa[] = array('Tires'=>34, 'Oil'=>55, 'Spark Plugs'=>433 ); $aa[] = array('Tires'=>23, 'Oil'=>33, 'Spark Plugs'=>44 ); echo '<pre>'; print_r( arrayUniqeBySubKey( $aa, 'Oil' ) ); echo '</pre>'; function arrayUniqeBySubKey( $array, $key ) { $indexAggregates = array(); foreach ( $array as $idx => $subArray ) { $indexAggregates[$subArray[$key]][] = $idx; } foreach ( $indexAggregates as $originalIndexes ) { $numOriginals = count( $originalIndexes ); if ( 1 == $numOriginals ) { continue; } for ( $i = 1; $i < $numOriginals; $i++ ) { unset( $array[$originalIndexes[$i]] ); } } return $array; }
Вы действительно можете использовать array_filter для фильтрации ваших данных:
$bb = array_filter($aa, function($item) { static $tmp = array(); if ($filter = !in_array($item['Oil'], $tmp)) { $tmp[] = $item['Oil']; } return $filter; });
Это использует статическую переменную внутри функции, чтобы «запомнить» уже возвращенное масло. Это работает, потому что $ tmp используется только во время выполнения array_filter . Если вы включите это в функцию и вызовите ее несколько раз, например, $ tmp всегда будет пустым массивом для первого вызова функции, предоставляемой array_filter .
Вторая задача, сортировка, может быть выполнена с использованием usort с пользовательской функцией сортировки:
usort($bb, function($a, $b) { return ($a['Spark Plugs'] > $b['Spark Plugs'] ? 1 : -1); });