2009-07-16 174 views
3

一个数组中删除受骗者/ 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); 

两个问题

  1. 我怎样才能根据TOT删除重复他场“011” 有没有array_unique,我可以提供一个回调作为自定义比较?

  2. 我如何排序的自定义字段“火花塞”

回答

1
  1. 我不知道你可以用它来做到这一点的函数。您必须对数组的值进行foreach并手动执行唯一性检查。

  2. 使用usort()函数并提供自定义比较器。

0

对于问题1,我认为array_filter是你需要的。

而且,就像布莱恩说的那样,请回答你的第二个问题。

+0

与array_filter问题是,他需要知道是否有任何其他条目与来自比较器内的值。我想不出有什么办法可以做到这一点,而不仅仅是自己迭代它。 – 2009-07-16 18:59:59

1

不用手动去,做一般的重复检查,我这样做

 


$aa2 = array() 

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

然后排序由键完成...

+0

$ aa2 [$ key] = $ value; 还是我错了? – 2009-07-23 12:03:03

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