在子数组具有相似的id
的情况下,我只想选择日期最高的那些。
$array = [
['id' => 10, 'date' => '10-24-1994'],
['id' => 10, 'date' => '10-24-1996'],
['id' => 10, 'date' => '10-24-1997'],
['id' => 10, 'date' => '10-24-1998'],
['id' => 9, 'date' => '10-24-1998'],
['id' => 9, 'date' => '10-24-2001'],
['id' => 9, 'date' => '10-24-1997'],
['id' => 8, 'date' => '10-24-1996'],
['id' => 10, 'date' => '10-24-1999'],
['id' => 10, 'date' => '10-24-1991'],
['id' => 10, 'date' => '10-24-1993'],
['id' => 8, 'date' => '10-24-2001']
]; /* array i have */
$expected_Result = [
['id' => 10, 'date' => '10-24-1999'],
['id' => 9, 'date'=> '10-24-2001'],
['id' => 8, 'date' => '10-24-2001'],
];
/* array which i expected */
答案 0 :(得分:3)
我将使用它作为解决方案,以便拥有一个键为ID本身的数组:
/**
* @return array<int,string>
*/
function sortDatesUniqueById(array $list): array
{
$result = [];
foreach ($list as ['id' => $id, 'date' => $date]) {
if (!isset($result[$id]) || $result[$id] < $date) {
$result[$id] = $date;
}
}
return $result;
}
或另一种方法,以准确获得您的要求:
/**
* @return array{id:int, date:string}
*/
function sortDatesUniqueById(array $list): array
{
$result = [];
foreach ($list as ['id' => $id, 'date' => $date]) {
if (!isset($result[$id]) || $result[$id]['date'] < $date) {
$result[$id] = ['id' => $id, 'date' => $date];
}
}
return array_values($result);
}
答案 1 :(得分:2)
仅循环遍历该数组,请检查该ID是否作为$result
数组中的索引存在。如果是这样,请检查新日期是否大于当前日期-如果是,则用新值覆盖它。
$result = [];
foreach ($array as $v) {
if (!isset($result[$v['id']])) {
$result[$v['id']] = $v['date'];
} elseif ($result[$v['id']] < $v['date']) {
$result[$v['id']] = $v['date'];
}
}
答案 2 :(得分:0)
您可以使用array_multisort()
,最后使用array_walk()
来使数组唯一。
array_multisort(
array_column($array, 'id'), SORT_DESC,
array_column($array, 'date'), SORT_DESC,
$array
);
$result = [];
array_walk($array, function ($item) use (&$result) {
!isset($result[$item['id']]) && $result[$item['id']] = $item['date'];
});
print '<pre>';
print_r($result);
答案 3 :(得分:0)
这是一支班轮,
首先按ID desc和日期asc排序。然后将键设置为id,以便其最后日期将覆盖每个小日期。然后使用array_values重置索引。
array_multisort(array_column($array, 'id'), SORT_DESC, array_column($array, 'date'), SORT_ASC, $array);
$result = array_values(array_column($array, null, "id"));
print_r($result);
array_column —从输入数组的单个列中返回值
注意: column_key:要返回的值列。该值可以是整数键 要检索的列的名称,也可以是 关联数组或属性名称。可能还 NULL 返回完整的数组或对象(这与 index_key以重新索引数组。
输出:-
Array
(
[0] => Array
(
[id] => 10
[date] => 10-24-1999
)
[1] => Array
(
[id] => 9
[date] => 10-24-2001
)
[2] => Array
(
[id] => 8
[date] => 10-24-2001
)
)
答案 4 :(得分:0)
我们可以先按ID和日期升序对数组进行排序,然后使用array_column提取最高日期。
$array = [
['id' => 10, 'date' => '10-24-1994'],
['id' => 10, 'date' => '10-24-1996'],
['id' => 10, 'date' => '10-24-1997'],
['id' => 10, 'date' => '10-24-1998'],
['id' => 9, 'date' => '10-24-1998'],
['id' => 9, 'date' => '10-24-2001'],
['id' => 9, 'date' => '10-24-1997'],
['id' => 8, 'date' => '10-24-1996'],
['id' => 10, 'date' => '10-24-1999'],
['id' => 10, 'date' => '10-24-1991'],
['id' => 10, 'date' => '10-24-1993'],
['id' => 8, 'date' => '10-24-2001']
];
uasort($array, function($a, $b) {
$r = $a['id'] <=> $b['id'];
if($r == 0)
return $a['date']<=>$b['date'];
return $r;
});
var_export(array_column($array, null, 'id'));
输出:
array (
8 =>
array (
'id' => 8,
'date' => '10-24-2001',
),
9 =>
array (
'id' => 9,
'date' => '10-24-2001',
),
10 =>
array (
'id' => 10,
'date' => '10-24-1999',
),
)
答案 5 :(得分:0)
这是我的解决方法。
$result = [];
foreach ($array as $value) {
if (!in_array($value['id'], array_column($result, 'id'))) {
$result[] = $value;
} else {
foreach ($result as $key => $res) {
if ($res['id'] === $value['id'] && $value['date'] < $res['date']) {
$result[$key]['date'] = $value['date'];
}
}
}
}
首先遍历每个值(如果不在列表中),将其添加到$result
变量中,否则,遍历$result
值并检查ID是否与当前{ {1}},最后检查到哪个日期更大。