如何在数组中找到特定元素(按上次修改日期和产品ID)?

时间:2017-11-09 21:24:49

标签: php arrays

这是一个包含两个产品的数组。它们之间的区别在于价格和最后修改日期。

$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();)

所以我想收到一个数组:

  • 苹果价格等于6,日期是2017-11-02,因为 日期大于价格等于5的日期,
  • 和橙色,其中pice等于3,日期是 2017-11-04,因为日期大于价格所在的日期 等于四

在这种情况下,它应该如下:

$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
    ));

非常感谢您的支持。

1 个答案:

答案 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);

或利用您的数据库,不要在代码中执行此操作。