【问题标题】:Multidimensional array unique based on value (not array key) [duplicate]基于值唯一的多维数组(不是数组键)[重复]
【发布时间】:2011-08-28 18:24:38
【问题描述】:

我有一个多维数组,我需要对它进行唯一性排序,因为我有重复的记录,所以我需要array_unique 来遍历数组并按值删除重复项,例如

Array
(
    [0] => Array
        (
            [id] => 324
            [time_start] => 1301612580
            [level] => 0.002
            [input_level] => 0.002
        )

    [1] => Array
        (
            [id] => 325
            [time_start] => 1301612580
            [level] => 0.002
            [input_level] => 0.002
        )

    [2] => Array
        (
            [id] => 326
            [time_start] => 1301612580
            [level] => 0.002
            [input_level] => 0.002
        )
)

有重复的time_start,它们都一样,还有levelinput_level,但它们不会受到影响,只有当有匹配的time_start时才应该删除它并处理整个数组(数组比你想象的要大,但我只是发布了一个数组的小例子)。应该删除欺骗并像这样返回:

Array
(
    [0] => Array
        (
            [id] => 324
            [time_start] => 1301612580
            [level] => 0.002
            [input_level] => 0.002
        )
)

我发现没有用的问题:

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:
    $input = array( /* your data */ );
    $temp  = array();
    $keys  = array();
    
    foreach ( $input as $key => $data ) {
        unset($data['id']);
        if ( !in_array($data, $temp) ) {
            $temp[]     = $data;
            $keys[$key] = true;
        }
    }
    
    $output = array_intersect_key($input, $keys);
    

    $input = array( /* your data */ );
    $temp  = $input;
    
    foreach ( $temp as &$data ) {
        unset($data['id']);
    }
    
    $output = array_intersect_key($input, array_unique($temp));
    

    【讨论】:

    • 您的键最终将成为数组索引,而不是单个关联字段名称。
    • 我认为 op 只关心一个字段,而不是“除了 id 之外的所有内容”。另外...不要在这里施放分散剂...但是 array_unique 那样工作吗?我认为它基本上在内部使用了严格的相等性,这将排除它用于比较这种性质的数组。
    • 好的,我查过了。它似乎使用字符串相等性进行检查。这在这种情况下不太有意义,直到我读到这个: 注意:请注意,array_unique() 不适用于多维数组。 -- 这是一个关联数组的数组。无论哪种方式,array_unique 的使用都让我感到害怕。 :)
    • 好吧好吧。它可以工作,但数组键没有正确索引,我需要在for 循环中使用数组,键被跳过,如[0], [12], [18] 等。
    • 因为它通过键获得了唯一的数组。如果你想重新枚举数组,只需使用:$output = array_values($output)
    【解决方案2】:
    $temp = array();
    array_filter($yourArray, function ($v) use (&$temp) {
        if (in_array($v['time_start'], $temp)) {
            return false;
        } else {
            array_push($temp, $v['time_start']);
            return true;
        }
    });
    

    使用array_filter(),它将根据回调结果过滤数组(我使用了一个匿名函数,从 PHP 5.3 开始就可以使用)。 time_start 值被收集到一个临时数组中。

    【讨论】:

    • 需要纠正的一件事。 array_filter 返回过滤后的数组,并且不会在原地更改数组(通过引用)。更多信息here
    【解决方案3】:

    我想你只需要走路:

    $usedVals = array();
    $outArray = array();
    foreach ($targetArray as $arrayItem)
    {
        if (!in_array($arrayItem['time_start'],$usedVals))
        {
            $outArray[] = $arrayItem;
            $usedVals[] = $arrayItem['time_start'];
        }
    }
    return $outArray;
    

    【讨论】:

    • @Darzan 反对什么? : ) 它会比上面的建议消耗更多的内存......但它真的不应该慢很多。另外,还有一些我正要解决的逻辑缺陷。
    【解决方案4】:
    $uniq = array();
    foreach($no_unique as $k=>$v) if(!isset($uniq[$v['time_start']])) $uniq[$v['time_start']] = $v;
    $uniq = array_values($uniq);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-01
      • 2019-02-15
      • 1970-01-01
      • 2021-10-08
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多