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

时间:2008-10-02 16:33:19

标签: php arrays associative-array

比如说你只是查询了一个数据库而你收到了这个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'];

我的问题是有没有办法在不使用循环的情况下获取此数组$名称?使用回调函数计为使用循环。

以下是获取每个字段的更一般示例。

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

10 个答案:

答案 0 :(得分:23)

截至6月20日,在PHP-5.5中有一个新函数array_column

例如:

$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe'
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith'
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones'
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe'
    )
);


$firstNames = array_column($records, 'first_name');
print_r($firstNames);

将返回

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

上述链接中有更多例子。

答案 1 :(得分:14)

我投了@Devon的回复,因为实际上没有办法用内置函数做你所要求的。你能做的最好就是自己编写:

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

答案 2 :(得分:7)

启动PHP 5.3,你可以使用lambda函数调用这个漂亮的函数:

$names = array_map(function ($v){ return $v['name']; }, $results);

这将返回按“名称”维度切片的数组。

答案 3 :(得分:5)

简单地说,不。

您需要使用循环或回调函数,如array_walk

答案 4 :(得分:2)

我对此做了更多的研究,发现ruby和prototype都有一个函数可以做到这一点array_pluck2。有趣的是,array_map有第二次使用,允许你做我想做的反向。我还发现有人正在写一个PHP class来模拟数组的原型操作。

我将要进行更多的挖掘工作,如果我找不到任何其他内容,我将处理一个补丁,提交到internals@lists.php.net邮件列表,看看他们是否会添加array_pluck。

答案 5 :(得分:2)

对于那些无法立即升级到PHP5.5且需要此功能的人,此处是array_column的实现。

function array_column($array, $column){
    $a2 = array();
    array_map(function ($a1) use ($column, &$a2){
        array_push($a2, $a1[$column]);
    }, $array);
    return $a2;
}

答案 6 :(得分:1)

如果您在5.5和array_column()之前运行PHP版本,则可以使用普通PHP中的官方替换:

https://github.com/ramsey/array_column

答案 7 :(得分:0)

我认为这会做你想做的事情

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,因此我没有对此进行测试。

答案 8 :(得分:0)

你可以这样做:

$tmp = array_flip($names);
$names = array_keys($tmp);

答案 9 :(得分:0)

这是array_column()

的快速功能替代方案
if(!function_exists('array_column')) {
    function array_column($element_name) {
        $ele =   array_map(function($element) {
            return $element[$element_name];
        }, $a);
        return  $ele;
    }
}