数组array的一些用法

array_filter

(PHP 4 >= 4.0.6, PHP 5, PHP 7) array_filter — 用回调函数过滤数组中的单元。(返回回调函数中返回true的元素,也就是过滤掉返回false的元素)

array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array

参数

  • array: 要循环的数组
  • callback:使用的回调函数

如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。更多信息见转换为布尔值。

  • flag: 决定callback接收的参数形式:

    ARRAY_FILTER_USE_KEY - callback接受键名作为的唯一参数

    ARRAY_FILTER_USE_BOTH -

返回值

返回过滤后的数组。

例子

使用回调函数时

获取数组中的奇数偶数

//奇数
function odd($var)
{
    // returns whether the input integer is odd
    return($var & 1);
}

//偶数
function even($var)
{
    // returns whether the input integer is even
    return(!($var & 1));
}

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);

echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));``

采用位运算, 1的二进制比较特殊:最后一位伟1,其他位都为0,用位异或和1计算,由于1的其他位都是0,就看另外一个数的最后1位是0还是1,如果是0,则和1的最后一位&计算得到的0,否则是1。

和 1 进行 & 运算的巧用,因为1的除了最后一位是1外,其他位置都是0,所以任何一个数字和1进行&运算,结果只有2种,要么是1,要么是0,由进行比较的数字的最后一位决定(由于1的其他位都是0,所以对位&计算后肯定是0)

不使用 callback 时的array_filter()

如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。

$entry = array(
             0 => 'foo',
             1 => false,
             2 => -1,
             3 => null,
             4 => ''
          );

print_r(array_filter($entry));

带 flag 标记的 array_filter()

$arr = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];

//只使用单个的键
var_dump(array_filter($arr, function($k) {
    return $k == 'b';
}, ARRAY_FILTER_USE_KEY));

//是用数组的值和键
var_dump(array_filter($arr, function($v, $k) {
    return $k == 'b' || $v == 4;
}, ARRAY_FILTER_USE_BOTH));

如果不用 flag 参数,并且function($v){},参数只有一个,是数组的值。所以回调函数中,可以单个使用key,单个使用value,同时使用key和value。

array_map

(PHP 4 >= 4.0.6, PHP 5, PHP 7)

array_map — 为数组的每个元素应用回调函数

array_map ( callable $callback , array $array1 [, array $... ] ) : array

array_map():返回数组,是为 array1 每个元素应用 callback函数之后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,两者必须一样

参数

  • callback:回调函数,应用到每个数组里的每个元素。
  • array1:数组,遍历运行 callback 函数。
  • ... 数组列表,每个都遍历运行 callback 函数。

返回值

返回数组,包含 callback 函数处理之后 array1 的所有元素。

例子

单个数组


//全局函数
function cube($n)
{
    return($n * $n * $n);
}
$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);

//匿名函数
$func = function($value) {
    return $value * 2;
};
print_r(array_map($func, range(1, 5)));

使用更多的数组

function show_Spanish($n, $m)
{
    return("The number $n is called $m in Spanish");
}

$a = array(1, 2, 3, 4, 5);
$b = array("uno", "dos", "tres", "cuatro", "cinco");

$c = array_map("show_Spanish", $a, $b);
print_r($c);

传入两个及以上的数组时,它们元素数量将会相同。因为回调函数会并行地处理相互对应的元素。 如果几个数组的元素数量不一致:空元素会扩展短那个数组,直到长度和最长的数组一样。

此函数有个有趣的用法:传入 NULL 作为回调函数的名称,将创建多维数组(一个数组,内部包含数组。)

多维数组:创建数组,内部包含数组

$a = array(1, 2, 3, 4, 5);
$b = array("one", "two", "three", "four", "five");
$c = array("uno", "dos", "tres", "cuatro", "cinco");

$d = array_map(null, $a, $b, $c);
print_r($d);``

以上例程会输出:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => one
            [2] => uno
        )

    [1] => Array
        (
            [0] => 2
            [1] => two
            [2] => dos
        )

    [2] => Array
        (
            [0] => 3
            [1] => three
            [2] => tres
        )

    [3] => Array
        (
            [0] => 4
            [1] => four
            [2] => cuatro
        )

    [4] => Array
        (
            [0] => 5
            [1] => five
            [2] => cinco
        )

)

如果仅传入一个数组,键(key)会保留;传入多个数组,键(key)是整型数字的序列。

array_map() 键(key)是 string

arr = array("stringkey" => "value");
function cb1($a) {
    return array ($a);
}
function cb2($a, $b) {
    return array ($a, $b);
}
var_dump(array_map("cb1", $arr));
var_dump(array_map("cb2", $arr, $arr));
var_dump(array_map(null,  $arr));
var_dump(array_map(null, $arr, $arr));
?>

以上例程会输出:

array(1) {
  ["stringkey"]=>
  array(1) {
    [0]=>
    string(5) "value"
  }
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "value"
    [1]=>
    string(5) "value"
  }
}
array(1) {
  ["stringkey"]=>
  string(5) "value"
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "value"
    [1]=>
    string(5) "value"
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值