Удалить дубликаты / сортировку из массива ассоциативных массивов в PHP

У меня есть массив ассоциативных массивов

 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);

Два вопроса

  1. Как я могу удалить дубликаты в соответствии с полем «Масло», есть ли массив_unique, который я могу предоставить обратный вызов, который действует как пользовательский компаратор?

  2. Как я могу сортировать по настраиваемому полю «Spark Plugs»

  1. Я не знаю, какую функцию вы можете использовать для этого. Вам нужно будет сделать foreach над значениями массива и выполнить проверку уникальности вручную.

  2. Используйте функцию 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); });