Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中从关联数组数组中删除重复项/排序_Php_Sorting_Unique_Associative Array_Duplicate Data - Fatal编程技术网

在PHP中从关联数组数组中删除重复项/排序

在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'

我有一个关联数组

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); 两个问题

  • 如何根据油田“油”删除重复项 是否有一个数组_unique,我可以提供一个作为自定义比较器的回调

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

  • 我不知道有什么函数可以用来做这个。您必须对数组的值执行foreach,并手动执行唯一性检查

  • 使用该函数并提供自定义比较器

  • 对于问题1,我认为这是您需要的


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