Что я делаю не так с 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);

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector