排序从关联数组在PHP
问题描述:
一个数组中删除受骗者/ I有关联数组的数组排序从关联数组在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);
两个问题
我怎样才能根据TOT删除重复他场“011” 有没有array_unique,我可以提供一个回调作为自定义比较?
我如何排序的自定义字段“火花塞”
答
不用手动去,做一般的重复检查,我这样做
$aa2 = array() foeach($aa as $key => $value) { $aa2[$value['Oil']] = $value; } $aa = $aa2;
然后排序由键完成...
+0
$ aa2 [$ key] = $ value; 还是我错了? – 2009-07-23 12:03:03
答
与去除问题愚弄这样,怎么办您确定哪些值仍然存在,因为您正在谈论部分唯一性。
下面的解决方案只是保持第一个以索引顺序出现。这不完全是优雅的,但它的工作原理。
<?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);
});
与array_filter问题是,他需要知道是否有任何其他条目与来自比较器内的值。我想不出有什么办法可以做到这一点,而不仅仅是自己迭代它。 – 2009-07-16 18:59:59