开发者

Multidimensional array unique based on value (not array key) [duplicate]

开发者 https://www.devze.com 2023-03-06 19:39 出处:网络
This question already has answers here: How can you make a multidimensional array unique? [duplicate] (6 answers)
This question already has answers here: How can you make a multidimensional array unique? [duplicate] (6 answers) Closed 10 years ago.

I have a multidimensional array which I need to be sorted with uniqueness as I have duplicated records, so I need array_unique to go through the array and remove duplicates by the value, e.g.

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

There are duplicated time_start, which they are all the same, also level and input_level but they are not to be affected, only if there are matching time_start it should remove it and process the whole array (the array is bigger than you think, but I just posted a small example of the array). Should remove dupes and return like this:

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

Questions I've found that didn't work:

  • reformat multidimensional array based on value
  • D开发者_如何转开发elete element from multidimensional-array based on value


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

or

$input = array( /* your data */ );
$temp  = $input;

foreach ( $temp as &$data ) {
    unset($data['id']);
}

$output = array_intersect_key($input, array_unique($temp));


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

Uses array_filter() which will filter an array based on the result of a callback (I used an anonymous function which can be used since PHP 5.3). The time_start values are collected into a temporary array.


I think you'll just have to walk it:

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


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

精彩评论

暂无评论...
验证码 换一张
取 消