在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 ); aa[]=(“轮胎”=>100,“机油”=>10,“火花塞”=>4); aa[]=(“轮胎”=>454,“机油”=>43,“火花塞”=>3); aa[]=(‘轮胎’=>34,‘机油’=>55,‘火花塞’=>44); aa[]=(“轮胎”=>454,“机油”=>43,“火花塞”=>45); aa[]=(‘轮胎’=>34,‘机油’=>55,‘火花塞’=>433); aa[]=(‘轮胎’=>23,‘机油’=>33,‘火花塞’=>44); 两个问题在PHP中从关联数组数组中删除重复项/排序,php,sorting,unique,associative-array,duplicate-data,Php,Sorting,Unique,Associative Array,Duplicate Data,我有一个关联数组 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'
正如Brian所说,请回答你的第二个问题。我没有手动去做通常的重复检查,而是这样做了 $aa2 = array() foeach($aa as $key => $value) { $aa2[$value['Oil']] = $value; } $aa = $aa2; $aa2=数组() foeach($aa作为$key=>$value){ $aa2[$value['Oil']]=$value; } $aa=$aa2;
然后通过键进行排序…以这种方式删除重复的问题是,如何确定保留哪些值,因为您谈论的是部分唯一性 下面的解决方案只是将第一个按索引顺序显示。它不太优雅,但很管用
<?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;
}
您确实可以使用数组过滤器过滤数据:
usort($bb, function($a, $b) {
return ($a['Spark Plugs'] > $b['Spark Plugs']
? 1
: -1);
});
这在函数中使用静态变量“记住”已返回的机油。这是可行的,因为$tmp仅在执行array_filter期间使用。例如,如果将其包装到函数中并多次调用,$tmp对于提供给array\u filter的函数的第一次调用将始终是空数组
第二个任务是排序,可以使用usort和自定义排序功能完成:
array_filter的问题是,他需要知道比较器中是否有其他具有该值的条目。我想不出比自己迭代更简单或更清晰的方法。
usort($bb, function($a, $b) {
return ($a['Spark Plugs'] > $b['Spark Plugs']
? 1
: -1);
});