3

我有一组关联数组

aa[] = ('轮胎'=>100, '机油'=>10, '火花塞'=>4 );
aa[] = ('轮胎'=>454, '机油'=>43, '火花塞'=>3 );
aa[] = ('轮胎'=>34, '机油'=>55, '火花塞'=>44 );
aa[] = ('轮胎'=>454, '机油'=>43, '火花塞'=>45 );
aa[] = ('轮胎'=>34, '机油'=>55, '火花塞'=>433);
aa[] = ('轮胎'=>23, '机油'=>33, '火花塞'=>44 );

两个问题

  1. 如何根据字段“Oil”删除重复项是否有一个 array_unique 可以提供一个作为自定义比较器的回调?

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

4

5 回答 5

1
  1. 我不知道您可以使用什么功能来执行此操作。您将不得不对数组的值进行 foreach 并手动进行唯一性检查。

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

于 2009-07-16T18:55:53.847 回答
1

我没有手动进行通常的重复检查,而是这样做了


$aa2 = 数组()

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

然后通过key进行排序...

于 2009-07-16T19:58:03.690 回答
0

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

而且,就像布赖恩说的,请回答您的第二个问题。

于 2009-07-16T18:57:59.897 回答
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期间使用。例如,如果您将其包装到一个函数中并多次调用它,对于提供给array_filter的函数的第一次调用, $tmp将始终是一个空数组。

第二个任务,排序,可以使用带有自定义排序功能的usort来完成:

usort($bb, function($a, $b) {
    return ($a['Spark Plugs'] > $b['Spark Plugs']
            ? 1
            : -1);
});
于 2011-10-14T00:34:46.093 回答
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;
}
于 2009-07-16T20:54:52.983 回答