【问题标题】:Group rows by two columns, filter grouped data to only keep the lowest value, and restructure associative rowsPHP - 如何将数组中的值更改为键值并对数据进行排序?
【发布时间】:2022-09-27 15:49:02
【问题描述】:

我有这个数组:

$array_1 = array(
     array(
        \'model\' => \'iPhone 12\',
        \'grade\' => \'A\',
        \'price\' => \'100\'
     ),

     array(
        \'model\' => \'iPhone 12\',
        \'grade\' => \'A\',
        \'price\' => \'95\'
     ),

     array(
        \'model\' => \'iPhone 12\',
        \'grade\' => \'B\',
        \'price\' => \'85\'
     ),

     array(
        \'model\' => \'iPhone 12\',
        \'grade\' => \'C\',
        \'price\' => \'75\'
     )

  );

我想将gradeprice 的值合并到它自己的键值对中,让它看起来像这样:

$array_2 = array(
     array(
        \'model\' => \'iPhone 12\',
        \'A\' => \'100\'
     ),

     array(
        \'model\' => \'iPhone 12\',
        \'A\' => \'95\'
     ),

     array(
        \'model\' => \'iPhone 12\',
        \'B\' => \'85\'
     ),

     array(
        \'model\' => \'iPhone 12\',
        \'C\' => \'75\'
     )

  );

然后我想通过查看具有相似等级的数组对数据进行排序,并只保留价格最低的数组。所以最后数组应该是这样的:

$array_3 = array(
     array(
        \'model\' => \'iPhone 12\',
        \'A\' => \'95\'
     ),

     array(
        \'model\' => \'iPhone 12\',
        \'B\' => \'85\'
     ),

     array(
        \'model\' => \'iPhone 12\',
        \'C\' => \'75\'
     )

  );

我该怎么做呢?

  • 你有没有尝试过什么?

标签: php arrays multidimensional-array associative-array key-value


【解决方案1】:

要在第二个数组中找到最低 A 价格,您必须过滤掉这样的关键A 开始,只是在那个时候,你并不真正知道你首先在寻找关键A ...

如果您以相反的方式进行操作,这会更容易 - 过滤商品,以便仅保留价格最低的商品,然后将其转换为您想要的格式。

$array_2 = [];
foreach($array_1 as $element) {
    if(!isset($array_2[$element['grade']]) ||
       $array_2[$element['grade']]['price'] > $element['price']) {
        $array_2[$element['grade']] = $element;
    }
}

我们使用grade 值作为钥匙对于我们的新数组 - 当该键下尚未设置任何元素,或者当前设置的元素的价格高于我们正在循环的当前元素时,我们那个键下的那个元素。

这导致

Array
(
    [A] => Array
        (
            [model] => iPhone 12
            [grade] => A
            [price] => 95
        )

    [B] => Array
        (
            [model] => iPhone 12
            [grade] => B
            [price] => 85
        )

    [C] => Array
        (
            [model] => iPhone 12
            [grade] => C
            [price] => 75
        )    
)

现在我们使用 array_map 将其转换为您想要的格式,并包装成 array_values 以将我们的键重置为从零开始的数字索引:

$array_3 = array_values(array_map(function($e) {
  return ['model' => $e['model'], $e['grade'] => $e['price']]; },
  $array_2)
);

array_map 内部,对于每个元素,我们返回一个新数组,该数组在同一个键下具有model 值,以及一个新的grade 下的元素,并具有 price 的值。

结果:

Array
(
    [0] => Array
        (
            [model] => iPhone 12
            [A] => 95
        )

    [1] => Array
        (
            [model] => iPhone 12
            [B] => 85
        )

    [2] => Array
        (
            [model] => iPhone 12
            [C] => 75
        )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多