如果值已经存在,则取消设置除最后一个子数组之外的所有子数组



我有下面的数组,它包含订单数据。基于order_date,如果一个日期在子数组中出现两次,那么我只想保留子数组的最后一个实例。

所以在下面的例子中,21-02和21-04都出现了两次,所以我想删除子数组1和4。

我真的很难尝试一下!

Array
(
[0] => Array
(
[order_id] => 12652
[order_date] => 21-01
[total] => 6.7
[cumulative] => 6.7
)
[1] => Array
(
[order_id] => 5204
[order_date] => 21-02
[total] => 21.65
[cumulative] => 28.35
)
[2] => Array
(
[order_id] => 7270
[order_date] => 21-02
[total] => 10.98
[cumulative] => 39.33
)
[3] => Array
(
[order_id] => 0
[order_date] => 21-03
[total] => 0
[cumulative] => 39.33
)
[4] => Array
(
[order_id] => 196331
[order_date] => 21-04
[total] => 12.6
[cumulative] => 51.93
)
[5] => Array
(
[order_id] => 199875
[order_date] => 21-04
[total] => 14.75
[cumulative] => 66.68
)
[6] => Array
(
[order_id] => 0
[order_date] => 21-05
[total] => 0
[cumulative] => 66.68
)
[7] => Array
(
[order_id] => 0
[order_date] => 21-06
[total] => 0
[cumulative] => 66.68
)
[8] => Array
(
[order_id] => 0
[order_date] => 21-07
[total] => 0
[cumulative] => 66.68
)
[9] => Array
(
[order_id] => 0
[order_date] => 21-08
[total] => 0
[cumulative] => 66.68
)
[10] => Array
(
[order_id] => 0
[order_date] => 21-09
[total] => 0
[cumulative] => 66.68
)
[total] => 66.68
[orders] => 5
[avg] => 13.336
)

您可以先用array_reverse()反转数组,然后用array_filter遍历数组中的每个元素,同时检查键之前是否出现过。如果在arrayfilter回调函数内部返回false,则该元素将被过滤掉。

这是代码:

$arr = array(
array(
'order_id' => '12652',
'order_date' => '21-01',
'total' => 6.7,
'cumulative' => 6.7
),
array(
'order_id' => 5204,
'order_date' => '21-02',
'total' => 21.65,
'cumulative' => 28.35
),
array(
'order_id' => 7270,
'order_date' => '21-02',
'total' => 10.98,
'cumulative' => 39.33,
),
array(
'order_id' => 0,
'order_date' => '21-03',
'total' => 0,
'cumulative' => 39.33
),
array(
'order_id' => 196331,
'order_date' => '21-04',
'total' => 12.6,
'cumulative' => 51.93
),
array(
'order_id' => 199875,
'order_date' => '21-04',
'total' => 14.75,
'cumulative' => 66.68
),
array(
'order_id' => 0,
'order_date' => '21-05',
'total' => 0,
'cumulative' => 66.68
),
array(
'order_id' => 0,
'order_date' => '21-06',
'total' => 0,
'cumulative' => 66.68
),
array(
'order_id' => 0,
'order_date' => '21-07',
'total' => 0,
'cumulative' => 66.68
),
array(
'order_id' => 0,
'order_date' => '21-08',
'total' => 0,
'cumulative' => 66.68
),
array(
'order_id' => 0,
'order_date' => '21-09',
'total' => 0,
'cumulative' => 66.68
),
'total' => 66.68,
'orders' => 5,
'avg' => 13.336,
);
echo '<pre>';
$res = array_filter(array_reverse($arr), function ($item) {
static $existentKeys = [];
if (isset($item['order_date'])) {
$order_date = $item['order_date'];
}
if (isset($order_date) && isset($existentKeys[$order_date])) {
return false;
} elseif (isset($order_date)) {
$existentKeys[$order_date] = true;
return $item;
}
return $item;
});
print_r(array_reverse($res));

最新更新