PHP中用数组作为needle调用in_array()未得预期结果的原因
问题分析与解决方案
嘿,我来帮你理清这个问题~
为什么你的代码没有输出?
核心问题是你误解了in_array()在needle为数组时的行为。当你传入数组作为needle时,in_array()的逻辑是:在haystack中寻找一个完全和needle一模一样的子数组,而不是检查needle里的所有元素是否都存在于haystack中。
看你的代码:
<?php $needle = array('fjord', 'troz'); $haystack = array('troz', 'zort', 'fran', 'fjord'); if (in_array($needle, $haystack)) { echo "match found in the array"; } ?>
你的haystack里全是单个字符串元素,根本没有['fjord', 'troz']这样的子数组,所以in_array()返回false,自然不会执行echo语句。
正确实现:检查needle所有元素是否都在haystack中
如果你想验证的是「needle里的每一个元素都能在haystack中找到」,可以用这几种方法:
方法1:用array_diff()判断差集为空
计算needle和haystack的差集,如果差集是空数组,说明所有元素都匹配:
<?php $needle = array('fjord', 'troz'); $haystack = array('troz', 'zort', 'fran', 'fjord'); if (empty(array_diff($needle, $haystack))) { echo "match found in the array"; } ?>
方法2:循环逐个检查元素
遍历needle的每个元素,逐一确认是否存在于haystack中:
<?php $needle = array('fjord', 'troz'); $haystack = array('troz', 'zort', 'fran', 'fjord'); $allMatch = true; foreach ($needle as $item) { if (!in_array($item, $haystack)) { $allMatch = false; break; } } if ($allMatch) { echo "match found in the array"; } ?>
方法3:用array_intersect()比较长度
取两个数组的交集,如果交集的长度和needle的长度一致,说明所有元素都存在:
<?php $needle = array('fjord', 'troz'); $haystack = array('troz', 'zort', 'fran', 'fjord'); if (count(array_intersect($needle, $haystack)) === count($needle)) { echo "match found in the array"; } ?>
额外补充
如果你的需求是「needle中至少有一个元素存在于haystack」,只需要判断array_intersect()的结果不为空,或者循环里只要找到一个匹配就终止即可。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

