TreeviewCopyright © aleen42 all right reserved, powered by aleen42
遍历处理
array_walk — 使用用户自定义函数对数组中的每个元素做回调处理
语法
bool array_walk( array &$array, callable $funcname[, mixed $userdata = NULL] )
描述
- 将用户自定义函数 funcname 应用到 array 数组中的每个单元
- array_walk() 不会受到 array 内部数组指针的影响
- array_walk() 会遍历整个数组而不管指针的位置
参数
参数 | 描述 |
---|---|
array | 输入的数组 |
funcname | 1.典型情况下 funcname 接受两个参数。array 参数的值作为第一个,键名作为第二个。2.如果 funcname 需要直接作用于数组中的值,则给 funcname 的第一个参数指定为引用。这样任何对这些单元的改变也将会改变原始数组本身。3.只有 array 的值才可以被改变,用户不应在回调函数中改变该数组本身的结构。例如增加/删除单元,unset 单元等等。4.如果 array_walk() 作用的数组改变了,则此函数的的行为未经定义,且不可预期。 |
userdata | 如果提供了可选参数 userdata,将被作为第三个参数传递给 callback funcname |
返回值
- 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例
$walk_array = [
['name' => '张三', 'phone' => '123456789'],
['name' => '李四', 'phone' => '123456789'],
['name' => '王二', 'phone' => '123456789'],
];
$param1 = '参数1';
$param2 = '参数2';
// 对每一个元素做回调处理,传值有两种方式,一种是使用use,另外一种是传递第三个参数,function中用第三个参数接收
// 如果想修改数组原来本身,则加&引用即可
// 方式一
$result = array_walk($walk_array, function (&$value, $index, $params) {
$value['name'] = $params['param1'] . '-' . $value['name'] . '-' . $params['param2'];
}, ['param1' => $param1, 'param2' => $param2]);
// 方式二
$params = ['param1' => $param1, 'param2' => $param2];
$result = array_walk($walk_array, function (&$value, $index) use ($params) {
$value['name'] = $params['param1'] . '-' . $value['name'] . '-' . $params['param2'];
});
print_r($result);
print_r($walk_array);
// 结果
1
Array
(
[0] => Array
(
[name] => 参数1-张三-参数2
[phone] => 123456789
)
[1] => Array
(
[name] => 参数1-李四-参数2
[phone] => 123456789
)
[2] => Array
(
[name] => 参数1-王二-参数2
[phone] => 123456789
)
)
array_walk_recursive — 对数组中的每个成员递归地应用用户函数
语法
bool array_walk_recursive( array &$input, callable $funcname[, mixed $userdata = NULL] )
描述
- 将用户自定义函数 funcname 应用到 array 数组中的每个单元。本函数会递归到更深层的数组中去。
参数
参数 | 描述 |
---|---|
input | 输入的数组 |
funcname | 1.典型情况下 funcname 接受两个参数。input 参数的值作为第一个,键名作为第二个。2.如果 funcname 需要直接作用于数组中的值,则给 funcname 的第一个参数指定为引用。这样任何对这些单元的改变也将会改变原始数组本身。 |
userdata | 如果提供了可选参数 userdata,将被作为第三个参数传递给 callback funcname |
返回值
- 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例
$fruits = ['sweet' => ['a' => 'apple', 'b' => 'banana'], 'sour' => 'lemon'];
array_walk_recursive($fruits, function (&$value, $key) {
$value = $value.'@';
echo $value . '-' . $key.'</br>';
});
// 结果
apple@-a
banana@-b
lemon@-sour
Array
(
[sweet] => Array
(
[a] => apple@
[b] => banana@
)
[sour] => lemon@
)
array_map — 将回调函数作用到给定数组的单元上
语法
array array_map( callable $callback, array $arr1[, array $...] )
描述
- array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。
- callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致
参数
参数 | 描述 |
---|---|
callback | 对每个数组的每个元素作用的回调函数 |
arr1 | 将被回调函数(callback)执行的数组 |
array | 将被回调函数(callback)执行的数组列表 |
返回值
- 返回一个数组,该数组的每个元素都数组(arr1)里面的每个元素经过回调函数(callback)处理了的
举例
// 示例1-简单使用
$a = [1, 2, 3, 4, 5];
$result = array_map(function ($v) {
return $v * $v * $v;
}, $a);
print_r($result);
// 结果
Array
(
[0] => 1
[1] => 8
[2] => 27
[3] => 64
[4] => 125
)
// 示例2-使用两个数组,返回的元素个数,由最大的数组元素决定
$a = [1, 2, 3, 4, 5];
$b = ['红', '橙', '黄', '绿', '青', '蓝', '紫色'];
$result = array_map(function ($v1, $v2) {
return $v1 . '-' . $v2;
}, $a, $b);
print_r($result);
// 结果
Array
(
[0] => 1-红
[1] => 2-橙
[2] => 3-黄
[3] => 4-绿
[4] => 5-青
[5] => -蓝
[6] => -紫色
)
// 示例3-通过array_map实现构造数组,将多个数组合并为一个数组,回调函数为null
$a = [1, 2, 3, 4, 5];
$b = ['one', 'two', 'three', 'four', 'five'];
$c = ['一', '二', '三', '四', '五'];
$result = array_map(null, $a, $b, $c);
print_r($result);
// 结果
Array
(
[0] => Array
(
[0] => 1
[1] => one
[2] => 一
)
[1] => Array
(
[0] => 2
[1] => two
[2] => 二
)
[2] => Array
(
[0] => 3
[1] => three
[2] => 三
)
[3] => Array
(
[0] => 4
[1] => four
[2] => 四
)
[4] => Array
(
[0] => 5
[1] => five
[2] => 五
)
)
// 示例4-如果数组参数里面有字符串的键,那么返回的数组就会包含字符串的键,仅且仅当只传入一个数组的时候(试了下,就是原数组返回,没变化啊,这不是蛋疼么?)。
$a = ['one' => 1, 'two' => 2];
$result = array_map(function ($v) {
return array($v);
}, $a);
print_r($result);
// 结果
Array
(
[one] => Array
(
[0] => 1
)
[two] => Array
(
[0] => 2
)
)
// 示例5-如果不止一个数组被传入,那么返回的数组的的键都是整型
$a = ['one' => 1, 'two' => 2];
$result = array_map(function ($v1, $v2) {
return array($v1, $v2);
}, $a, $a);
print_r($result);
// 结果
Array
(
[0] => Array
(
[0] => 1
[1] => 1
)
[1] => Array
(
[0] => 2
[1] => 2
)
)
array_filter — 用回调函数过滤数组中的单元
语法
array array_filter( array $array[, callable $callback[, int $flag = 0]] )
描述
- 依次将 input 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE,则 input 数组的当前值会被包含在返回的结果数组中
- 数组的键名保留不变
参数
参数 | 描述 |
---|---|
input | 要循环的数组 |
callback | 如果没有提供 callback 函数,将删除 input 中所有等值为 FALSE 的条目 |
flag | 决定callback接收的参数形式: ARRAY_FILTER_USE_KEY - callback接受键名作为的唯一参数 。ARRAY_FILTER_USE_BOTH - callback同时接受键名和键值 |
等值为FALSE
要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换 当转换为 boolean 时,以下值被认为是 FALSE:
- 布尔值 FALSE 本身
- 整型值 0(零)
- 浮点型值 0.0(零)
- 空字符串,以及字符串 "0"
- 不包括任何元素的数组
- 不包括任何成员变量的对象(仅 PHP 4.0 适用)
- 特殊类型 NULL(包括尚未赋值的变量)
- 从空标记生成的 SimpleXML 对象
返回值
- 返回过滤后的数组
举例
// 示例1-输出都为奇数的
$filter_array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$result = array_filter($filter_array,function($value,$index){
return ($value & 1);
},ARRAY_FILTER_USE_BOTH);
print_r($result);
// 结果
Array
(
[0] => 1
[2] => 3
[4] => 5
[6] => 7
[8] => 9
)
// 示例2-输出都为偶数的
$filter_array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$result = array_filter($filter_array,function($value,$index){
return !($value & 1);
},ARRAY_FILTER_USE_BOTH);
print_r($result);
// 结果
Array
(
[1] => 2
[3] => 4
[5] => 6
[7] => 8
[9] => 10
)
// 示例3-去除数组中为空的
$filter_array = [1, 5, null, '', false, 0, 0.0, '0', '0.0'];
$result = array_filter($filter_array);
print_r($result);
// 结果
Array
(
[0] => 1
[1] => 5
[8] => 0.0
)
array_reduce — 用回调函数迭代地将数组简化为单一的值
语法
mixed array_reduce( array $input, callable $function[, mixed $initial = NULL] )
描述
- array_reduce() 将回调函数 function 迭代地作用到 input 数组中的每一个单元中,从而将数组简化为单一的值
参数
参数 | 描述 |
---|---|
input | 输入的数组 |
function | 回调函数 |
initial | 如果指定了可选参数 initial,该参数将被当成是数组中的第一个值来处理,或者如果数组为空的话就作为最终返回值 |
返回值
- 返回结果值。initial 参数,array_reduce() 返回 NULL
举例
// 示例1-如果指定了可选参数 initial,该参数将被当成是数组中的第一个值来处理,或者如果数组为空的话就作为最终返回值
$reduce_array = [];
$result = array_reduce($reduce_array, function () {
return;
}, '初始值');
print_r($result);
// 结果
初始值
// 示例2-指定initial,并且use使用参数
$reduce_array = ['one', 'two'];
$str = '/';
$result = array_reduce($reduce_array, function ($v1, $v2) use ($str) {
return $v1 . $v2 . $str;
}, '@');
print_r($result);
// 结果
@one/two/
// 示例3-上面都是处理一维数组,下面看一下二维数组
$reduce_array = [
['name' => '张三'],
['name' => '李四'],
];
$result = array_reduce($reduce_array, function ($v1, $v2) {
$temp = [];
$temp['name'] = $v1['name'] . '/' . $v2['name'];
return $temp;
}, ['name' => '第一个初始name']);
print_r($result);
// 结果
Array
(
[name] => 第一个初始name/张三/李四
)
// 示例4-复杂点的应用,组合方式
$arr = [
['红', '黄', '蓝'],
['大', '中', '小']
];
$str = ';';
$result = array_reduce($arr, function ($v, $m) use ($str) {
$temp = [];
foreach ($v as $vv) {
foreach ($m as $mm) {
if (empty($vv)) {
$temp[] = $mm;
else {
$temp[] = $vv . $str . $mm;
}
}
}
return $temp;
}, ['']);
print_r($result);
// 结果
Array
(
[0] => 红;大
[1] => 红;中
[2] => 红;小
[3] => 黄;大
[4] => 黄;中
[5] => 黄;小
[6] => 蓝;大
[7] => 蓝;中
[8] => 蓝;小
)