PHP二维数组,获取二维数组中某个KEY集合的高效率写法

技术文档 - php相关

2019-11-24

 暂无演示  

我们在开发过程中经常会从Mysql数据库中查询数据,然后又要对数据进行处理。

我们来讲讲处何处理要效率要高一些。


比如我们从Mysql数据库中查询出下面的二维数据:

$res = array(  
    0 => array(  
        'id'    => 10,  
        'name'  => 'PHP',  
    ),  
    1 => array(  
        'id'    => 20,  
        'name'  => 'html',  
    ),  
    2 => array(  
        'id'    => 30,  
        'name'  => 'mysql',  
    ),
    3 => array(  
        'id'    => 40,  
        'name'  => 'java',  
    )
);

现在我们需要对上面的数组进行处理:

1)获取索引 "id"的集合、并且保存为一个数组、即得到 array(10,20,30,40)?

2)获取索引 "name"的集合、并且保存为一个数组、即得到 array('php','html','mysql','java')?

如果是以前我的写法就是直接 foreach、然后 array_push 一个个的往一个数组变量里塞。

这样也能实现、但这样的写法很影响性能、因为使用 PHP 原生的函数肯定比循环效率高。

下面是推荐大家用的写法:

<?php

$res = array(  
    0 => array(  
        'id'    => 10,  
        'name'  => 'PHP',  
    ),  
    1 => array(  
        'id'    => 20,  
        'name'  => 'html',  
    ),  
    2 => array(  
        'id'    => 30,  
        'name'  => 'mysql',  
    ),
    3 => array(  
        'id'    => 40,  
        'name'  => 'java',  
    )
);

#   1:获取$res二维数组中,索引id的集合
$ids = array();  
$ids = array_map('array_shift', $res); 
print_r($ids);

#   2:获取$res二维数组中,索引id的集合
$idss = array();  
$idss = array_map(function($v){return $v['id'];}, $res); 
print_r($idss);

#   3:获取$res二维数组中,索引name的集合
echo '<br/><br/><br/>';
$names = array();  
$names = array_reduce($res, create_function('$v,$w', '$v[]=$w["name"];return $v;'));
print_r($names);

#   4:获取$res二维数组中,索引name的集合
$namess = array();  
$namess = array_map(function($v){return $v['name'];}, $res); 
print_r($namess);



/**
 *  当然上面两种方法还有一种写法的,不过需要PHP版本支持:PHP 5 >= 5.5.0
  *    如果要在底版本中也使用的话,我们就需要自己动手写一个array_column函数方法。
 */
 
if (!function_exists('array_column')) {
    function array_column($array, $column_key, $index_key = null) {
        $column_key_isNumber = (is_numeric($column_key)) ? true : false;
        $index_key_isNumber  = (is_numeric($index_key)) ? true : false;
        $index_key_isNull    = (is_null($index_key)) ? true : false;
        
        $result = array();
        foreach((array)$array as $key=>$val){
            if($column_key_isNumber){
                $tmp = array_slice($val, $column_key, 1);
                $tmp = (is_array($tmp) && !empty($tmp)) ? current($tmp) : null;
            } else {
                $tmp = isset($val[$column_key]) ? $val[$column_key] : null;
            }
            if(!$index_key_isNull){
                if($index_key_isNumber){
                    $key = array_slice($val, $index_key, 1);
                    $key = (is_array($key) && !empty($key)) ? current($key) : null;
                    $key = is_null($key) ? 0 : $key;
                }else{
                    $key = isset($val[$index_key]) ? $val[$index_key] : 0;
                }
            }
            $result[$key] = $tmp;
        }
        return $result;
    }
}
 
 
#   1:获取$res二维数组中,索引id的集合
$ids = array();  
$ids = array_column($res, 'id');
print_r($ids);

#   2:获取$res二维数组中,索引name的集合
$names = array();  
$names = array_column($res, 'name');
print_r($names);
?>


还是在用foreach遍历的童鞋要注意了哦。