Что я делаю не так с array_walk (и есть ли лучший способ)?

У меня есть массив под названием "методы", и это выглядит так:

[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 ответ

Решение

Ты можешь использовать uasort() функция PHP, которая будет сортировать ваш массив в соответствии с вашими 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);

демонстрация

Другие вопросы по тегам