Удалить дубликаты / сортировку из массива ассоциативных массивов в PHP - PullRequest
3 голосов
/ 16 июля 2009

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

aa[] = ('Tires'=>100, 'Oil'=>10, 'Spark Plugs'=>4 );
aa[] = ('Tires'=>454, 'Oil'=>43, 'Spark Plugs'=>3 );
aa[] = ('Tires'=>34,  'Oil'=>55, 'Spark Plugs'=>44 );
aa[] = ('Tires'=>454, 'Oil'=>43, 'Spark Plugs'=>45 );
aa[] = ('Tires'=>34,  'Oil'=>55, 'Spark Plugs'=>433 );
aa[] = ('Tires'=>23,  'Oil'=>33, 'Spark Plugs'=>44 );

Два вопроса

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

  2. Как отсортировать по настраиваемому полю 'Свечи зажигания'

Ответы [ 5 ]

1 голос
/ 16 июля 2009

Вместо того, чтобы вручную делать обычную проверку дубликатов, я сделал это



$aa2 = array()

foeach($aa as $key => $value)  {
  $aa2[$value['Oil']] = $value;
}
$aa = $aa2;

Затем была выполнена сортировка по ключу ...

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

  2. Используйте функцию usort () и предоставьте собственный компаратор.

0 голосов
/ 14 октября 2011

Вы действительно можете использовать 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);
});
0 голосов
/ 17 июля 2009

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

Это решение, приведенное ниже, просто сохраняет первое появление в порядке индекса. Это не совсем элегантно, но работает.

<code><?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 '
'; функция arrayUniqeBySubKey ($ array, $ key) { $ indexAggregates = array (); foreach ($ массив как $ idx => $ subArray) { $ indexAggregates [$ subArray [$ key]] [] = $ idx; } foreach ($ indexAggregates как $ originalIndexes) { $ numOriginals = count ($ originalIndexes); if (1 == $ numOriginals) { Продолжить; } для ($ i = 1; $ i
0 голосов
/ 16 июля 2009

Для вопроса 1, я думаю array_filter - это то, что вам нужно.

И, как говорит Брайан, используйте ваш второй вопрос.

...