过滤具有唯一列值的行并优先考虑另一列中具有特定值的行
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)
我有一个需要唯一的数组,我需要有一个条件来检查值 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)