基于值(不是数组键)的多维数组唯一

时间:2011-05-19 10:22:20

标签: php arrays multidimensional-array

我有一个多维数组,我需要按唯一性进行排序,因为我有重复的记录,所以我需要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
        )
)

我发现的问题不起作用:

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

$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值被收集到一个临时数组中。

答案 2 :(得分:1)

我想你只需要走它:

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

答案 3 :(得分:0)

$uniq = array();
foreach($no_unique as $k=>$v) if(!isset($uniq[$v['time_start']])) $uniq[$v['time_start']] = $v;
$uniq = array_values($uniq);