遍历处理

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] => 蓝;小
)

results matching ""

    No results matching ""