array_walk 我做错了什么(还有更好的方法)?
What am I doing wrong with array_walk (and is there a better way)?
我有一个名为 "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
)
我想做的是改变每个 [cost],使其等于 [cost] 减去 (min) [cost]。换句话说,下面的每一个都将减少 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;
}
我部分想知道为什么这不起作用,但我也希望有一种更优雅的方法。
您可以使用 PHP 的 uasort()
函数,它会根据 ascending
顺序中的 cost
值对数组进行排序。然后简单地使用 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);
我有一个名为 "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
)
我想做的是改变每个 [cost],使其等于 [cost] 减去 (min) [cost]。换句话说,下面的每一个都将减少 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;
}
我部分想知道为什么这不起作用,但我也希望有一种更优雅的方法。
您可以使用 PHP 的 uasort()
函数,它会根据 ascending
顺序中的 cost
值对数组进行排序。然后简单地使用 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);