【问题标题】:How return is working from array_map PHParray_map PHP 的返回是如何工作的
【发布时间】:2016-09-18 12:13:31
【问题描述】:

我对 PHP 还很陌生,但我知道一旦 PHP 在函数中遇到 return,它将退出函数并返回到调用它的位置。

我对@9​​87654322@ 下面的函数如何或为什么以return 开头并在函数内部有另一个感到困惑。

function array_plucked($toPluck, $arr) {
return array_map(function($item) use($toPluck) {
    return $item[$toPluck];
}, $arr); }

而且每次循环遍历数组时,$item[$toPluck] 到底发生了什么,结果存储在哪里?

【问题讨论】:

    标签: php return array-map


    【解决方案1】:

    好问题!好的,让我们清理一下:

    function array_pluck($key, $array)
    {
        return array_map(function ($item) use ($key) {
            return $item[$key];
        }, $array);
    }
    

    这样理解起来会容易一些。

    首先,此函数的目标是从多维数组中返回一个特定键值的一维数组。以下是示例:

    $testArray = array(
        array("xxx" => "hello", "yyy" => "goodbye"),
        array("xxx" => "hi", "yyy" => "bye"),
        array("xxx" => "hey", "yyy" => "peace"),
    );
    
    php > var_dump(array_pluck('xxx', $testArray));
    array(3) {
      [0]=>
      string(5) "hello"
      [1]=>
      string(2) "hi"
      [2]=>
      string(3) "hey"
    }
    
    php > var_dump(array_pluck('yyy', $testArray));
    array(3) {
      [0]=>
      string(7) "goodbye"
      [1]=>
      string(3) "bye"
      [2]=>
      string(5) "peace"
    }
    php >
    

    如您所见,这分别为父数组中的每个数组返回 $testArray[<index>]['xxx']$testArray[<index>]['yyy']

    现在解释return 的情况。 array_map() 函数将一个函数(或“Callable”)作为第一个参数,将一个数组作为第二个参数。该函数针对数组中的每个元素运行,然后array_map() 将该函数的返回值添加到array_map() 返回的新数组中。

    这称为anonymous function

    function ($item) use ($key) {
        return $item[$key];
    }
    

    它与任何其他函数一样,只是它没有名称,并且具有use (...) 语法。 use ($key) 表示从外部函数(array_pluck())“导入”$key,所以它可以在这个匿名函数内部使用。上例中$testArray 的每个元素都作为$item 传递给这个匿名函数。当return $item[$key] 出现时,只有匿名函数返回(退出),array_map() 继续到下一个元素。

    【讨论】:

    • 好答案,但是:“然后 array_map() 用该函数的返回值替换原始元素,在 array_map() 返回的新数组中” - 不清楚原始数组是否被替换或创建一个新数组。我会这样写:“然后 array_map() 将该函数的返回值添加到 array_map() 返回的新数组中”。
    • 谢谢!我已经使用了您的编辑。这听起来确实更清楚。
    • 没问题@programming2music,很高兴为您提供帮助!如果您的问题得到完全回答,请单击答案旁边的复选框以接受它。
    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2014-02-25
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2016-06-14
    相关资源
    最近更新 更多