这是一个包含两个产品的数组。它们之间的区别在于价格和最后修改日期。
$array = array(
"0" => array
(
"id" => 1,
"name" => apple,
"product_price" => 5,
"date_and_time" => 2017-11-01
),
"1" => array
(
"id" => 1,
"name" => apple,
"product_price" => 6,
"last_mod_date" => 2017-11-02
),
"2" => array
(
"id" => 2,
"name" => orange,
"product_price" => 4,
"last_mod_date" => 2017-11-03
),
"3" => array
(
"id" => 2,
"name" => orange,
"product_price" => 3,
"last_mod_date" => 2017-11-04
));
我的问题是如何为数组中的每个产品构建一个新数组,其中最后一个修改日期具有最大值?所以,我需要在修改日期方面比较数组中的每个产品,然后将它们推送到新数组($ products = array();)
所以我想收到一个数组:
在这种情况下,它应该如下:
$products = array(
"0" => array
(
"id" => 1,
"name" => apple,
"product_price" => 6,
"last_mod_date" => 2017-11-02
),
"1" => array
(
"id" => 2,
"name" => orange,
"product_price" => 3,
"last_mod_date" => 2017-11-04
));
非常感谢您的支持。
答案 0 :(得分:0)
这是一种提供非常少的信息或教育价值但利用PHP本机数组函数的方法。
<?php
function getLatestById($id, $data) {
foreach ($data as $key => $row) {
$idColumn[$key] = $row['id'];
$modifiedColumn[$key] = $row['modified'];
}
array_multisort($idColumn, SORT_ASC, $modifiedColumn, SORT_DESC, $data);
$k = array_search(1, array_column($data, 'id'));
return $data[$k];
}
$foo = [];
$foo[] = ['id' => 1, 'modified' => '2017-11-01', 'price' => 5];
$foo[] = ['id' => 1, 'modified' => '2017-11-02', 'price' => 6];
$foo[] = ['id' => 2, 'modified' => '2017-11-03', 'price' => 4];
$foo[] = ['id' => 2, 'modified' => '2017-11-04', 'price' => 3];
var_dump(getLatestById($id, $foo));
所以思考是按ID排序,然后按修改排序。一旦你得到一个排序的数组,你就会用ID来阻止第一次出现。
对于更多说明性代码,我可能会编写一个循环,在其中使用ID作为索引填充新数组。如果修改了更大(更近期)的覆盖,则将现有值与一次迭代进行比较。有点像...
$foo = [];
$foo[] = ['id' => 1, 'modified' => '2017-11-01', 'price' => 5];
$foo[] = ['id' => 1, 'modified' => '2017-11-02', 'price' => 6];
$foo[] = ['id' => 2, 'modified' => '2017-11-03', 'price' => 4];
$foo[] = ['id' => 2, 'modified' => '2017-11-04', 'price' => 3];
$a = [];
foreach ($foo as $k => $v) {
if (empty($a[$v['id']]) || $a[$v['id']]['modified'] < $v['modified']) {
$a[$v['id']] = $v;
}
}
var_dump($a);
或利用您的数据库,不要在代码中执行此操作。