PHP涨姿势——那些熟悉又陌生的方法(Array篇)
写在前面的废话
入坑时间久了,有时候总会觉力不从心、每遇到一个BUG的时候总有一些新发现,然而多数都能在文档中找到答案。于是决定好好撸一撸PHP的一些常用或不常用的方法。先从Array类的开始吧
一、array_change_key_case
返回字符串键名全为小写或大写的数组
input ----需要操作的数组。
case ---- CASE_UPPER 或 CASE_LOWER(默认值)。
这个函数用法比较简单,两个参数,返回字符串键名全为小写或大写的数组;
但这里我想重点说的是异常情况下也就是输入值不是数组时的返回值。
官方文档说明:
Returns an array with its keys lower or uppercased, or FALSE if array is not an array.
Throws E_WARNING if array is not an array.
也就是说在函数输入值不是期望的数组类型时,返回值是false 并且会抛出一个 E_WARNING 级别的错误。
$input_array = 'I am not Array';
$new = array_change_key_case($input_array);
var_dump(NULL===$new );
var_dump(false===$new);
看一下上面这几行代码。输出结果会是什么?PHP7和PHP5 有什么区别?动手试一下吧。
二、array_column
返回数组中指定的一列 (PHP 5 >= 5.5.0, PHP 7)
input* – 需要取出数组列的多维数组(或结果集)
column_key ---- 需要返回值的列,它可以是索引数组的列索引,或者是关联数组的列的键。 也可以是NULL,此时将返回整个数组(配合index_key参数来重置数组键的时候,非常管用)
index_key ---- 作为返回数组的索引/键的列,它可以是该列的整数索引,或者字符串键值。
用这个函数我们可以从一个多维数组或结果集中取出特定的列来组成新的数组。举个例子:
$area = array(
['id'=>1,'name'=>'北京','code'=>'bj'],
['id'=>2,'name'=>'天津','code'=>'tj'],
['id'=>3,'name'=>'上海','code'=>'shh'],
['id'=>4,'name'=>'重庆','code'=>'chq'],
);
//出name 列
$area_names = array_column($area,'name');
/**
Array
(
[0] => 北京
[1] => 天津
[2] => 上海
[3] => 重庆
)
**/
实际很多情况下我们可能需要用数据中特定的值当做键值;这时候就需要用到第三个参数;
$code_names = array_column($area,'name','code')
/**
Array
(
[bj] => 北京
[tj] => 天津
[shh] => 上海
[chq] => 重庆
)
**/
使用时注意PHP版本,(PHP 5 >= 5.5.0, PHP 7) PHP5.5及以后版本才有这个方法。
下面提供一个老版本兼容方法:
if (!function_exists('array_column')) {
function array_column($input, $column_key, $index_key = null) {
$return_ = array();
if(!is_array($input)){
return NULL;
}
foreach ($input as $key => $value) {
if (!isset($value[$column_key])) {
continue;
}
if (isset($index_key)){
$return_[$value[$index_key]] = $value[$column_key]);
}else{
$return_[] = $value[$column_key]);
}
}
return $return_;
}
}
三、array_combine
创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
keys ---- 将被作为新数组的键。非法的值将会被转换为字符串类型(string)。
values ---- 将被作为数组的值。
这个函数能够将两个数组合并成一个新的数据。但是又一个重要的条件就是两个数组的程度要一致。如果作为keys的数组和作为values的数组的元素个数不一样,将会抛出一个警告错误(E_WARNING)。 返回值一般会是false;
在无法保证keys 和 valuse 的长度适中一致的情况下,建议在使用该函数前先判断两者的长度;
$color = array('green', 'red', 'yellow');
$fruits = array('avocado', 'apple', 'banana');
if(count($color) == count($fruits)){
$combine = array_combine($color, $fruits);
}
var_dump($combine);
四、array_chunk
将一个数组分割成多个
input ---- 需要操作的数组
size ---- 每个数组的单元数目
preserve_keys ---- 设为 TRUE,可以使 PHP 保留输入数组中原来的键名。如果你指定了 FALSE,那每个结果数组将用从零开始的新数字索引。默认值是 FALSE
讲真实际开发中没有用过这个函数,需要分组段的话一般会在具体需要遍历数组的地方进行处理;
使用这个函数如果 size
参数是动态的那就要特别注意这一点:
如果 size 小于 1,会抛出一个 E_WARNING 错误并返回 NULL
五 、array_key_exists
检查给定的键名或索引是否存在于数组中
key ---- 要检查的键。
search — 一个数组,包含待检查的键。
判断数组中是否存在某个索引;我以为这种般判断是可以用 isset()
来判断的;就像这样:
search = array('first' => 1, 'second' => 4);
if (array_key_exists('first', $search)) {
echo "array_key_exists() : In the array".PHP_EOL;
}
if (isset($search['first'])) {
echo "isset() : In the array";
}
但是如果刚好遇到这样的情况:那就是判断的键所对应的值刚好是 NULL
;
比如 $search = array('first' => NULL, 'second' => 4);
上面的结果就不太一样啦!有兴趣就动手试一下。