PHP 判断二维数组中是否含有某个值

主要是由于用 mysqli_fetch_all() 这函数返回的数组是数字索引的二维数组,有时候咱们须要判断一个主键是否在这个二维数组中就会遇到一些麻烦,常见的作法就是写循环判断,可是若是须要判断屡次的状况下,咱们循环这么屡次会大大下降脚本的性能,咱们应该要如何改进?思路就是把子数组中的键值做为数组索引,而后直接用 if 或者 array_key_exists() 就能够判断了。php

<?php

//数据库就不建立了,直接代码模拟。

$data = [

          0 =>  [
                    'id' => 5698,
                    'first_name' => 'Bill',
                    'last_name' => 'Gates',
                ],
    
          1 =>  [
                    'id' => 4767,
                    'first_name' => 'Steve',
                    'last_name' => 'Jobs',
                ],

           2 => [
                    'id' => 3809,
                    'first_name' => 'Mark',
                    'last_name' => 'Zuckerberg',
                ],

    ];

//咱们用 mysqli_fetch_all() 函数之后确定会获得相似这样的数值索引二维函数。子数组先以关联数组演示。

//方法一

$arr = [];

foreach( $data as $key => $value){
    $arr[$data[$key]['id']] = $value; 
}

echo '<pre>';
    print_r($arr);
echo '<pre/>';

/*

输出数组

Array
(
    [5698] => Array
        (
            [id] => 5698
            [first_name] => Bill
            [last_name] => Gates
        )

    [4767] => Array
        (
            [id] => 4767
            [first_name] => Steve
            [last_name] => Jobs
        )

    [3809] => Array
        (
            [id] => 3809
            [first_name] => Mark
            [last_name] => Zuckerberg
        )

)

输出以ID为索引的二维数组成功。

*/

/*

方法二

利用 array_column() 函数

该函数返回输入的多维数组中全部子数组中的某个索引的值组成的数组。
输入的必须是多维数组(关联数组和索引数组均可以),否则返回数组为空数组。
子数组中的索引能够是字符串索引也能够是数字索引。
第二个参数也能够是 NULL,此时将返回子数组中全部元素(配合 index_key 参数来重置数组键的时候,很是有用)。
第三个参数能够规定该子数组某个索引(键名)的键值成为返回数组中的键值对的键名。

返回数组的键值为输入的多维数组中子数组中的某个键名的键值,返回数组的键名按如下规则
1.若是有第三个参数,则按第三个参数规定的值。
2.若是第三个参数为空,返回数组的键名则是以 0 开始 的数字索引。


*/


$arr = [];

$arr = array_column($data,null,'id');
//第二个参数设置为null,这样返回数组的键值为子数组的全部元素。
//第三个参数设置为id,这样返回数组的键名为子数组中id索引的键值。


echo '<pre>';
    print_r($arr);
echo '<pre/>';



/*

输出数组

Array
(
    [5698] => Array
        (
            [id] => 5698
            [first_name] => Bill
            [last_name] => Gates
        )

    [4767] => Array
        (
            [id] => 4767
            [first_name] => Steve
            [last_name] => Jobs
        )

    [3809] => Array
        (
            [id] => 3809
            [first_name] => Mark
            [last_name] => Zuckerberg
        )

)

输出以ID为索引的二维数组成功。

*/

顺便测试了一下这两个方法的效率。mysql

<?php

$data = [];

for($n = 0;$n<100000;$n++)
{
    $data [] =  [
        'id' => md5(uniqid(mt_rand(), true)), //生成惟一id
        'first_name' => 'Mark',
        'last_name' => 'Zuckerberg',
    ];
}




$t1 = microtime(true);

foreach( $data as $key => $value){
    $arr[$data[$key]['id']] = $value;
}


//$arr = array_column($data,null,'id');


$t2 = microtime(true);

echo $t2-$t1; 

/*

数组的元素个数在五千时,这两个方法的执行效率同样,
可是数组元素个数在一万时,下面的方法效率比上面方法的效率快了一倍左右。

*/