1

我经常遇到这种情况:

foreach ($someObjects as &$someObject)
{
  $someObjectsIndex[$someObject->id] = $someObject;
}

和这个:

$thingsIActuallyWant = [];
foreach ($associativeList as &$associativeItem)
{
  $thingsIActuallyWant[] = $associativeItem['id'];
}

我想知道是否有现有的方法或其他东西可以更短地编写这些东西,而无需编写 foreach 循环。

4

2 回答 2

2

您可以使用array_map它返回一个包含您想要的元素的数组。

对于第二个例子:

$thingsIActuallyWant = array_map(function($a){
    return $a['id'];
}, $associativeList);

至于第一个,我建议使用foreach你所拥有的,因为任何替代方案都将是一个丑陋的array_mapand array_combine

于 2013-01-21T20:38:28.003 回答
1

您可以尝试自己编写一个函数,如下所示:

function pluck($arr, $key)
{
    $tbr = array();

    foreach ($arr as $val)
    {
        if (is_array($val) && isset($val[$key]))
        {
            $tbr []= $val[$key];
        }
        elseif (is_object($val) && isset($val->$key))
        {
            $tbr [] = $val->$key;
        }
    }

    return $tbr;    
}

然后你可以称之为:

$thingsIActuallyWant = pluck($associativeList, 'id');

此外,除非需要,否则应避免通过引用 foreach 循环来传递变量。

于 2013-01-21T20:35:18.480 回答