2009-07-16 2 views
3

У меня есть массив ассоциативных массивовУдалить простофили/сортировать из массива ассоциативных массивов в PHP

 
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. Как я могу удалить дубликаты по карапуз он поле «Нефть» есть массив_unique, который я могу предоставить обратный вызов, который действует как пользовательский компаратор?

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

ответ

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

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

0

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

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

+0

проблема с array_filter в том, что он должен знать, действительно ли есть какие-либо другие данные с тем, что значение из компаратора. Я не мог придумать, как сделать это, что было проще или яснее, чем просто перебирать его самостоятельно. –

1

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

 


$aa2 = array() 

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

Затем сортировкой было сделано с помощью ключа ...

+0

$ aa2 [$ key] = $ value; или я не прав? –

0

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

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

<?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; 
} 
0

Вы действительно можете использовать 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); 
}); 
Смежные вопросы