【问题标题】:Remove dupes/sort from a Array of Associative Arrays in PHP从 PHP 中的关联数组数组中删除欺骗/排序
【发布时间】:2010-11-11 11:50:20
【问题描述】:

我有一个关联数组

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. 如何根据字段“石油”删除重复项 是否有一个 array_unique 我可以提供一个作为自定义比较器的回调?

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

【问题讨论】:

    标签: php sorting unique associative-array duplicate-data


    【解决方案1】:
    1. 我不知道您可以使用什么函数来执行此操作。您必须对数组的值进行 foreach 并手动进行唯一性检查。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • array_filter 的问题在于他需要知道比较器中是否有任何其他具有该值的条目。我想不出一种比自己迭代更简单或更清晰的方法。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        以这种方式删除欺骗的问题是,您如何确定保留哪些值,因为您正在谈论部分唯一性。

        下面的这个解决方案只是保持第一个以索引顺序出现。它不是很优雅,但很有效。

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

        【讨论】:

          【解决方案5】:

          您确实可以使用 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 将始终是一个空数组。 p>

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

          usort($bb, function($a, $b) {
              return ($a['Spark Plugs'] > $b['Spark Plugs']
                      ? 1
                      : -1);
          });
          

          【讨论】:

            猜你喜欢
            • 2011-07-23
            • 1970-01-01
            • 2020-03-13
            • 2011-02-26
            • 2011-01-28
            • 1970-01-01
            • 1970-01-01
            • 2011-07-27
            • 2018-09-16
            相关资源
            最近更新 更多