PHP数组深入应用

程序人生
PHP中,数组是用一种HASH结构(HashTable)来实现的,PHP使用了一些机制,使得可以在O(1)的时间复杂度下实现数组的增删, 并同时支持线性遍历和随机访问。
对于Phper而言,数组是用得最广泛的数据结构了。基本可以这么说,熟练掌握数组你就可以熟练掌握PHP的大部分了。

下面我们来聊聊对数组的复杂操作。
有如下二维数组

$newArray = array(
    array('id' => 1, 'name' => 'lilei', 'age' => 30, 'sex' => '男'),
    array('id' => 2, 'name' => 'hanmeimei', 'age' => 29, 'sex' => '女'),
    array('id' => 3, 'name' => 'Jim', 'age' => 31, 'sex' => '男'),
    array('id' => 4, 'name' => 'lucy', 'age' => 28, 'sex' => '女')
);

1、现在来取所有id的值,然后组成一个新的数组;
通常我们的做法是遍历数组,然后根据键把取到的值放到一个新的数组;
$ids = array();
foreach($newArray as $val){
    $ids[] = $val['id'];
}
print_r($ids);

//代码输出:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)
下面这句代码也能实现同样的功能,是不是更简捷更666呢。
$ids = array_map('array_shift', $newArray);
print_r($ids);

//代码输出:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)
在此方法的基础上,可以稍微开一下脑洞。
如果需要获取的是二维数组的每一项的开头列或结尾列,也可以这样做:
$reset = array_map('reset', $newArray);
print_r($reset);
//代码输出:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

$end = array_map('end', $newArray);
print_r($end);
//代码输出:
Array
(
    [0] => 男
    [1] => 女
    [2] => 男
    [3] => 女
)

2、那现在问题来了,如果取name的值来组成新数组,哪种方法更强呢?
遍历的方法我们就直接跳过了,还来用更666的方法解决。
如果你的PHP版本>=5.5.0,可以直接用PHP内置函数array_column:
$names = array_column($newArray, 'name');
print_r($names);
//代码输出:
Array
(
    [0] => lilei
    [1] => hanmeimei
    [2] => Jim
    [3] => lucy
)
第二个参数为想要获取的那一列的键名,是不是很方便呢;
不过对于PHP版本低于5.5.0的就只能另辟捷径了:
$names = array_reduce(
    $newArray, create_function('$v,$w', '$v[$w["id"]]=$w["name"];return $v;')
);
print_r($names);
//代码输出:
Array
(
    [1] => lilei
    [2] => hanmeimei
    [3] => Jim
    [4] => lucy
)

3、现在如果要以age字段来进行排序,各位童鞋又会怎么做
遍历呀什么的效率太低,直接略过,下面看大招:
$ages = array_reduce(
    $newArray, create_function('$v,$w', '$v[$w["id"]]=$w["age"];return $v;')
);
array_multisort($ages, SORT_DESC, SORT_NUMERIC, $newArray);
print_r($newArray);
//代码输出:
Array
(
    [0] => Array
        (
            [id] => 3
            [name] => Jim
            [age] => 31
            [sex] => 男
        )

    [1] => Array
        (
            [id] => 1
            [name] => lilei
            [age] => 30
            [sex] => 男
        )

    [2] => Array
        (
            [id] => 2
            [name] => hanmeimei
            [age] => 29
            [sex] => 女
        )

    [3] => Array
        (
            [id] => 4
            [name] => lucy
            [age] => 28
            [sex] => 女
        )
)
参数中的数组被当成一个表的列并以行来进行排序 - 这类似 SQL 的 ORDER BY 子句的功能。
第一个参数是排序字段组成的数组,随后的每一个参数可能是数组,也可能是下面的排序顺序标志(排序标志用于更改默认的排列顺序)之一:
排列顺序可选 SORT_ASC(升序,默认) 和 SORT_DESC(降序);
随后可以指定排列类型可选 SORT_REGULAR(常规顺序,默认)、SORT_NUMERIC(数字顺序)和SORT_STRING(字母顺序);
此函数用法相当灵活,详细请自行百度脑补。

Tags: PHP 数组
  • 还没有评论,沙发等你来抢
*         

正在加载验证码......