PHP的in

06-01 1171阅读

大家都知道,PHP是个神奇的语言,而in_array这个函数,简直就是PHP世界里的“宝藏”函数。今天咱们就来聊聊这个函数,看看它有哪些坑,以及如何优雅地避开这些坑。

先来个简单的例子,假设你有一个数组,里面装了一堆水果,你想检查某个水果是否在这个数组里。代码如下:

$fruits = ['apple', 'banana', 'orange'];
if (in_array('apple', $fruits)) {
    echo 'We have apples!';
}

这个代码会输出" We have apples!",简单?但是,事情远没有这么简单。

坑一:类型松散比较

PHP的in_array默认是松散比较,也就是说,它会进行类型转换。比如:

$numbers = [1, 2, 3];
if (in_array('1', $numbers)) {
    echo 'We have number 1!';
}

这段代码也会输出" We have number 1!",因为字符串'1'会被转换成整数1。如果你想要严格的类型比较,可以设置in_array的第三个参数为true:

} else {
    echo 'No string 1 in numbers!';
}

这时,输出会是" No string 1 in numbers!",因为字符串'1'和整数1在严格比较下是不相等的。

坑二:数组中的false和0

再看个例子:

$values = [false, 0, null];
if (in_array('hello', $values)) {
    echo 'We have hello!';
} else {
    echo 'No hello in values!';
}

这个代码会输出" We have hello!"。为啥?因为'hello'被转换成布尔值true,而true与false、0、null在松散比较下都可以匹配。为了避免这种问题,记得使用严格比较。

坑三:数组中的空字符串

再看看这个例子:

$options = ['', 'option1', 'option2'];
if (in_array(0, $options)) {
    echo 'We have 0!';
} else {
    echo 'No 0 in options!';
}

这个代码会输出" We have 0!",因为0在松散比较下会匹配空字符串。搞不好你以为是数组里有0,实际上它匹配的是空字符串。

坑四:数组中的null

再看一个:

$data = [null, 1, 2];
if (in_array('', $data)) {
    echo 'We have empty string!';
} else {
    echo 'No empty string in data!';
}

这个代码会输出" We have empty string!",因为空字符串在松散比较下会匹配null。

坑五:多维数组

PHP的in

in_array只能处理一维数组,如果你有多维数组,它就会变成瞎子。比如:

$multiArray = [
    ['fruit' => 'apple'],
    ['fruit' => 'banana'],
    ['fruit' => 'orange']
];
if (in_array(['fruit' => 'apple'], $multiArray)) {
} else {
    echo 'No apples in multi array!';
}

这个代码会输出" No apples in multi array!",因为in_array无法处理多维数组的匹配。你得自己写个函数来处理多维数组的搜索。

如何优雅地避开这些坑?

1. 使用严格比较:in_array的第三个参数设置为true,避免类型转换带来的坑。

2. 处理多维数组:自己写个递归函数来搜索。

3. 使用array_search:如果你需要获取匹配项的键名,array_search可能更合适,它也有严格比较的选项。

替代方案:array_search

array_search和in_array类似,但它会返回匹配项的键名。同样地,它也可以进行严格比较。比如:

$key = array_search('apple', $fruits);
if ($key !== false) {
    echo 'We have apples at index ' . $key;
}

这个代码会输出" We have apples at index 0"。如果找不到匹配项,array_search会返回false,所以记得用!==来检查返回值,避免0混淆。

替代方案:isset

如果你只是想检查某个键是否存在,isset比in_array更高效。比如:

PHP的in

$fruits = ['apple' => true, 'banana' => true, 'orange' => true]; if (isset($fruits['apple'])) { }

这个代码会输出" We have apples!",isset直接在键上查找,效率比in_array高。

替代方案:array_key_exists

和isset类似,但isset会在值为null时返回false,而array_key_exists不会。比如:

$fruits = ['apple' => null];
} else {
    echo 'No apples in fruits but key exists!';
}
if (array_key_exists('apple', $fruits)) {

这个代码会输出" No apples in fruits but key exists!"和" We have apples key!"。

替代方案:in_array的替代方案

如果你需要更多的控制,可以使用array_filter、array_reduce等函数。比如:

$hasApple = array_reduce($fruits, function($carry, $item) {
    return $carry || $item === 'apple';
}, false);
if ($hasApple) {
}

这个代码会输出" We have apples!",虽然比in_array啰嗦,但你可以自定义比较逻辑。

总结

in_array是个好用的函数,但也隐藏着不少坑。使用的时候,记得设置严格比较,处理多维数组时要自己动手,考虑效率时可以用isset或array_key_exists。PHP的世界里,没有永恒的坑,只有永恒的警惕和优雅的代码。希望这篇文能帮你避开in_array的坑,写出更靠谱的代码。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码