我对array_walk做错了什么(有没有更好的方法)?

时间:2015-10-29 07:09:41

标签: php arrays array-walk

我有一个名为“methods”的数组,它看起来像这样:

[0] => Array (
    [id] => WWAM
    [title] => WWAM
    [cost] => 4.35
    )
[1] => Array (
    [id] => CNQM
    [title] => CNQM
    [cost] => 5.21
    )
[2] => Array (
    [id] => CNAM
    [title] => CNAM
    [cost] => 6.58
    )

我想要做的是改变每个[成本],使其成本减去(最小)[成本]。换句话说,下面的每一个都将减少4.35(WWAM一个将为零)。可能有更好的方法来解决这个问题,但我想我会尝试使用array_walk。但是,这对我不起作用。这是我试过的:

      $lowestpricedoption = 100000;
      foreach ($methods as $item) {
        if ($item['cost'] < $lowestpricedoption) {
          $lowestpricedoption = $item['cost'];
        }
      }
      array_walk( $methods, 'subtractLowest', $lowestpricedoption );

      function subtractLowest(&$item, $key, $lowestval)
      {
        $item['cost'] -= $lowestval;
      }

我部分想知道为什么这不起作用,但我也会欣赏一种更优雅的方法。

1 个答案:

答案 0 :(得分:1)

您可以使用PHP的uasort()功能,根据cost订单中的ascending值对您的数组进行排序。然后只需使用current()函数以及数组解除引用,您就可以获得最低的代价值

uasort($arr, function($a,$b){
    return $a['cost'] - $b['cost'];
});
$min = current($arr)['cost'];
array_walk($arr,function(&$v,$k)use($min){
    $v['cost'] -= $min;
});
print_r($arr);

Demo