【问题标题】:PHP 7 best/concise way to pass both key and value to a functionPHP 7 将键和值都传递给函数的最佳/简洁方法
【发布时间】:2017-11-29 11:52:47
【问题描述】:

我想知道是否可以改进。

我有一个包含键和值的数组。

我想将这些键和值传递到一个函数中,每行作为单独的实体。

数组示例:

[basket][products] {
    [10] => 3 
    [12] => 5
    [15] => 1
  }

我目前使用:

    foreach($data['basket']['products'] as $product => $quantity) {
        $basketClass->addItem($product,$quantity);
    }
    unset($product,$quantity);

这是 4 行。

我不想更改数组中的值,我只想将它们全部逐行应用于->addItem 函数。

是否有更短、更简洁或“更干净”的方式来执行此操作,特别强调新的 PHP7 功能?

【问题讨论】:

  • 短于 3 行? :D
  • *四行。 Foreach 留下应该整理的剩余值。
  • 3行,因为{}可以去掉(-;
  • 我的评论有点争议 ;) 但恕我直言,这是个人意见问题 - 看看@this reddit thread reddit.com/r/PHP/comments/1uuc34/… - 如果性能方面的这个小差异不关心你,你可以试试array_walkof course - 正如答案中已经提到的那样
  • 不是更少的代码(实际上更多),但你可以重组它吗? $basketClass->addItemsFromArray($data['basket']['products']) 然后在那里执行 loop/array_walk (取消设置是不必要的,因为它已本地化到该函数的范围内)。产生额外的代码,但会将这部分减少为单行¯_(ツ)_/¯。对我来说似乎是微优化,但你必须有理由想让它更整洁,所以我只想说将处理移到其他地方。

标签: php arrays php-7


【解决方案1】:

没有很多“更短”的方法可以做到这一点,只是将更多代码塞进一行,但您可能会发现使用array_walk 更简洁:

array_walk($data['basket']['products'], function($quantity, $product) use($basketClass) {
  $basketClass->addItem($product, $quantity);
});

这不会修改数组本身,也不需要您在之后取消设置任何变量。示例见https://eval.in/909861

不过,这最终是个人意见问题。

【讨论】:

  • 是的,正如你所说,这取决于个人意见;我发现array_walk 不太整洁,但很好奇社区是否知道任何(整洁的)快捷方式。
  • 是的,我同意。对我来说,标准循环总是更具可读性。如果之后只是剩下的变量是一个问题,那么您可以安全地将它们留在范围内 - 如果您通过引用循环,它通常只会导致问题。要么你不再使用它们,要么用其他东西覆盖它们。
  • 我看到使用 array_walk 变量得到了整理,在我看来这是一个优点。 +1
【解决方案2】:

你可以使用array_walk

array_walk($data['basket']['products'], function($quantity, $product) use($basketClass) { 
 $basketClass->addItem($product,$quantity);
});

【讨论】:

  • 谢谢我看过array_walk,但感觉不那么“整洁”(但这完全是主观的)
  • 这是可能的,但在我看来,这似乎是一个更易读的代码,但这完全是主观的:)
  • 是的,为了简洁,有一个交易可读性的因素,但是谢谢。 +1
【解决方案3】:

它看起来很难看,但它确实有效。

$a = $data['basket']['products'];
array_map(
   "call_user_func", 
   array_fill(0, count($a), array($basketClass, "addItem")), 
   array_keys($a), array_values($a)
);

好吧,如果您删除该行,它将是一行。

array_map("call_user_func", array_fill(0, count($a), array($basketClass, "addItem")), array_keys($a), array_values($a));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2015-12-20
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多