过滤具有唯一列值的行并优先考虑另一列中具有特定值的行

Filter rows with unique column value and prioritize rows with a particular value in another column

我有一个需要唯一的数组,我需要有一个条件来检查值 dis 是否处于 ANSWERED 状态。如果是,则保留它并删除处于 NO ANSWER 状态的行。

这是我的完整数组

Array
(
    [0] => Array
        (
            [dest] => 960
            [dis] => ANSWERED
        )

    [1] => Array
        (
            [dest] => 596
            [dis] => NO ANSWER
        )

    [2] => Array
        (
            [dest] => 596
            [dis] => ANSWERED
        )

    [3] => Array
        (
            [dest] => 595
            [dis] => NO ANSWER
        )

    [4] => Array
        (
            [dest] => 595
            [dis] => NO ANSWER
        )

)

删除重复项后:

Array
(
    [dest] => 960
    [dis] => ANSWERED
)
Array
(
    [dest] => 596
    [dis] => NO ANSWER
)
Array
(
    [dest] => 596
    [dis] => ANSWERED
)
Array
(
    [dest] => 595
    [dis] => NO ANSWER
)

with this code :
foreach(array_unique($testArr, SORT_REGULAR) as $doc)
{
    print_r($doc);
}

我现在需要做的是删除 array[1],因为 array[2] with key : dis is ANSWERED

您可以分两步完成:

<?php

$data = [
    ['dest' => 960, 'dis' => 'ANSWERED'],
    ['dest' => 596, 'dis' => 'NO ANSWER'],
    ['dest' => 596, 'dis' => 'ANSWERED'],
    ['dest' => 595, 'dis' => 'NO ANSWER'],
    ['dest' => 595, 'dis' => 'NO ANSWER'],
];

// Step 1: Filtering step
$intermediate = [];
foreach ($data as $item) {
    if (!isset($intermediate[$item['dest']])) {
        $intermediate[$item['dest']] = $item['dis'];
    } elseif ($item['dis'] === 'ANSWERED') {
        $intermediate[$item['dest']] = $item['dis'];
    }
}

// Step 2: Rebuild to final format
$result = [];
foreach ($intermediate as $key => $value) {
    $result[] = ['dest' => $key, 'dis' => $value];
}

print_r($result);

给出:

Array
(
    [0] => Array
        (
            [dest] => 960
            [dis] => ANSWERED
        )
    [1] => Array
        (
            [dest] => 596
            [dis] => ANSWERED
        )
    [2] => Array
        (
            [dest] => 595
            [dis] => NO ANSWER
        )
)

在将行推入结果数组的同时迭代分配临时键。此外,如果目标尚未在结果数组中表示,或者如果 dis 已回答,则存储该行。

代码:(Demo)

$result =[];
foreach ($data as $row) {
    if (!isset($result[$row['dest']]) || $row['dis'] === 'ANSWERED') {
        $result[$row['dest']] = $row;
    }
}
var_export(array_values($result));  // reindex the result array

您可以使用array_map函数

function fun2($v1)
{
    if ($v1->dis=='ANSWERED') return $v;
}
$finalArray = array_map("fun1", $testArr));
print_r($finalArray)