在其元素之一上切片多维PHP数组

时间:2020-03-06 15:02:11  来源:igfitidea点击:

举例来说,我们刚刚查询了一个数据库,就收到了这个2D数组。

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);

我经常发现自己这样写循环。

foreach($results as $result)
    $names[] = $result['name'];

我的问题是,是否存在一种无需使用循环即可获取此数组$ names的方法?使用回调函数算作使用循环。

这是获取每个字段的更通用的示例。

foreach($results as $result)
    foreach($result as $key => $value)
        $fields[$key][] = $value;

解决方案

简而言之,不。

我们将需要使用循环或者诸如array_walk之类的回调函数。

我投票赞成@Devon的回答,因为实际上没有一种方法可以使用内置函数来完成我们要问的事情。我们能做的最好的就是编写自己的:

function array_column($array, $column)
{
    $ret = array();
    foreach ($array as $row) $ret[] = $row[$column];
    return $ret;
}

我想这会做你想要的

array_uintersect_uassoc

你将不得不做这样的事情

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);
$name = array_uintersect_uassoc( $results, array('name' => 'value')  , 0, "cmpKey");
print_r($name);

//////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////
function cmpKey($key1, $key2) {
  if ($key1 == $key2) {
    return 0;
  } else {
    return -1;
  }
}

但是,我没有访问PHP5的权限,所以我没有对此进行测试。

我对此进行了更多研究,发现ruby和原型都具有执行此功能的函数,称为array_pluck,2. 有趣的是,array_map具有第二种用法,它使我们可以做我想在这里做的相反的事情。我还发现有人在编写一个PHP类来模仿数组的原型操作。

我将进行更多挖掘,如果找不到其他内容,我将处理一个补丁以提交到[email protected]邮件列表,看看它们是否会添加array_pluck。