【问题标题】:Filter rows with unique column value and prioritize rows with a particular value in another column过滤具有唯一列值的行并优先考虑另一列中具有特定值的行
【发布时间】:2022-01-27 00:47:17
【问题描述】:

我有一个需要唯一的数组,我需要有一个条件来检查值 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);
}

我现在需要做的是删除没有回答的数组[1],因为数组[2] with key : dis 是回答

【问题讨论】:

标签: php arrays multidimensional-array duplicates filtering


【解决方案1】:

在将行推入结果数组时迭代分配临时键。此外,如果 dest 尚未在结果数组中表示或者如果 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

【讨论】:

  • @Assaf 如果那个答案是“完美的”,那么这个答案更“完美”。
  • 是的,这也很完美:)
  • 两种解决方案都很好,他回答了我的问题并在您的解决方案之前解决了它,也感谢您的解决方案;)
【解决方案2】:

您可以分两步完成:

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

【讨论】:

  • 绝对可以用一个循环完成。
  • @mickmackusa 带 0 循环和array_reduce() ;-)
【解决方案3】:

你可以使用array_map函数

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

【讨论】:

  • 这个无法解释的sn-p不满足问题要求。
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 2022-10-09
  • 2021-07-08
  • 2013-01-02
  • 2022-01-22
  • 1970-01-01
  • 2015-04-24
相关资源
最近更新 更多