首页 > 解决方案 > PHP数组按值和最小值-最大值分组

问题描述

我需要在 PHP 中合并数组的帮助,我有这个数组,我正在尝试按模型对项目进行分组,并从year合并最小值和最大值:

[0] => Array
    (
        [brand] => SUZUKI
        [model] => GSF 1250 Bandit
        [year] => 2006
    )

[1] => Array
    (
        [brand] => SUZUKI
        [model] => GSF 1250 Bandit
        [year] => 2007
    )

[2] => Array
    (
        [brand] => SUZUKI
        [model] => GSF 1250 Bandit
        [year] => 2008
    )


[3] => Array
    (
        [brand] => SUZUKI
        [model] => GSX 1250FA
        [year] => 2011
    )

[4] => Array
    (
        [brand] => SUZUKI
        [model] => GSX 1250FA
        [year] => 2012
    )

[5] => Array
    (
        [brand] => SUZUKI
        [model] => GSR 600
        [year] => 2006
    )

[6] => Array
    (
        [brand] => SUZUKI
        [model] => GSR 600
        [year] => 2007
    )

[7] => Array
    (
        [brand] => SUZUKI
        [model] => GSR 600
        [year] => 2008
    )

我想按模型对项目进行分组,并合并year的最小值和最大值,如下所示:

[0] => Array
    (
        [brand] => SUZUKI
        [model] => GSF 1250 Bandit
        [year] => 2006 - 2008
    )

[1] => Array
    (
        [brand] => SUZUKI
        [model] => GSX 1250FA
        [year] => 2011 - 2012
    )

[2] => Array
    (
        [brand] => SUZUKI
        [model] => GSR 600
        [year] => 2006 -2008
    )

我知道如何按模型对项目进行分组,但我无法实现合并年份:

foreach($array as $row){
    $newArray[$row["model"]] = array(
        "brand" => $row["brand"],
        "model" => $row["model"],
        "year" => $row["year"]
    );
}

感谢您的任何帮助。

标签: phparraysmerge

解决方案


这将其分为两个阶段,首先收集每个项目的最小和最大年份的数据。设置最小值和最大值时,它会检查先前的值(如果未找到,则默认为默认值)并应用适当的min()max()...

$newArray = [];
foreach($array as $row){
    $newArray[$row["model"]] = array(
        "brand" => $row["brand"],
        "model" => $row["model"],
        "minyear" => min($newArray[$row["model"]]["minyear"] ?? PHP_INT_MAX, $row["year"]),
        "maxyear" => max($newArray[$row["model"]]["maxyear"] ?? PHP_INT_MIN, $row["year"]),
    );
}

这会产生...

Array
(
    [GSF 1250 Bandit] => Array
        (
            [brand] => SUZUKI
            [model] => GSF 1250 Bandit
            [minyear] => 2006
            [maxyear] => 2008
        )

    [GSX 1250FA] => Array
        (
            [brand] => SUZUKI
            [model] => GSX 1250FA
            [minyear] => 2011
            [maxyear] => 2012
        )

)

然后,您可以处理它以提供您所追求的格式的年份(删除不再使用的字段)...

foreach ( $newArray as &$row )  {
    $row['year'] = $row['minyear'] . " - ". $row['maxyear'];
    unset ( $row['minyear'], $row['maxyear'] );
}

产生...

Array
(
    [GSF 1250 Bandit] => Array
        (
            [brand] => SUZUKI
            [model] => GSF 1250 Bandit
            [year] => 2006 - 2008
        )

    [GSX 1250FA] => Array
        (
            [brand] => SUZUKI
            [model] => GSX 1250FA
            [year] => 2011 - 2012
        )

)

推荐阅读