代码之家  ›  专栏  ›  技术社区  ›  gradbot

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

  •  21
  • gradbot  · 技术社区  · 16 年前

    例如,您刚刚查询了一个数据库,并且收到了这个二维数组。

    $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'];
    

    我的问题是,是否存在一种不使用循环获取数组$name的方法?使用回调函数等于使用循环。

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

    foreach($results as $result)
        foreach($result as $key => $value)
            $fields[$key][] = $value;
    
    10 回复  |  直到 7 年前
        1
  •  23
  •   Lorenz Meyer    11 年前

    截至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
    )
    

    在上面提到的链接中还有更多的例子。

        2
  •  14
  •   Philipp Kyeck    11 年前

    我投票给了@devon的回复,因为实际上没有一种方法可以用内置的功能来完成你的要求。你最好自己写:

    function array_column($array, $column)
    {
        $ret = array();
        foreach ($array as $row) $ret[] = $row[$column];
        return $ret;
    }
    
        3
  •  7
  •   Alexey Petushkov    12 年前

    从php 5.3开始,您可以将这个漂亮的调用与lambda函数一起使用:

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

    这将返回按“name”维度划分的数组。

        4
  •  5
  •   Devon    16 年前

    简单地说,不。

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

        5
  •  2
  •   gradbot    16 年前

    我对此做了更多的研究,发现Ruby和Prototype都有一个函数,它可以调用 array_pluck , 2 . 有趣的是 array_map 有第二个用途,让你做我想做的相反的事情。我还找到了一个PHP class 有人正在写模拟阵列的原型操作。

    我将做更多的挖掘,如果我找不到任何其他东西,我将使用一个补丁提交到internals@lists.php.net邮件列表,看看他们是否会添加array-pull。

        6
  •  2
  •   MirroredFate    11 年前

    对于那些无法升级到 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;
    }
    
        7
  •  1
  •   JohnK    10 年前

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

    https://github.com/ramsey/array_column

        8
  •  0
  •   Bill    16 年前

    我想这会满足你的需要

    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的权限,所以我没有测试过这个。

        9
  •  0
  •   cheesemacfly Deisbel R Diaz    11 年前

    你可以这样做:

    $tmp = array_flip($names);
    $names = array_keys($tmp);
    
        10
  •  0
  •   Manoj Sharma    7 年前

    这是array_column()的快速函数替换项。

    if(!function_exists('array_column')) {
        function array_column($element_name) {
            $ele =   array_map(function($element) {
                return $element[$element_name];
            }, $a);
            return  $ele;
        }
    }