我刚刚开始讨论与Pinterest相关的PHP(新的PHP)编码。我坚持对多维数组进行字符串搜索。我做了很多研究并尝试了不同的东西,但是在针对多维数组的字符串搜索方面找不到多少帮助。
具体来说,我在此帖子中尝试了递归数组搜索: in_array() and multidimensional array ,但它对我不起作用。也许我做错了什么,这就是为什么我在这里寻求一些PHP专家的帮助。
当我针对我的多维数组(下面提到)运行它时,我每次都会得到答案,并且无关紧要我指定的字符串。
例如:如果我运行下面的代码,并且它说找到了,虽然它应该说找不到,因为我的多维数组中有 Irix 字。
"Pear"
下面是我的多维数组:
echo in_array_r("Irix", $info) ? 'found' : 'not found';
答案 0 :(得分:1)
当你比较不同类型的弱值时,你得到的结果是PHP的类型杂耍。
试试这个,例如:
$x = ('Irix' == 0 );
var_export( $x );
你得到TRUE
!
为什么?
'Irix'
转换为int
,转化后为0
,因此将{true}与0
进行比较。
在您的数组中,您将多个值设置为0
,以便明确找到Irix
的原因。
调用函数时应使用严格比较:
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
如果您需要使用弱比较(例如,为了匹配123 == '123'
),您可以调整函数以在进行弱比较时将数字转换为字符串:
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
// cast $item to string if numeric when doing weak comparison
if( ! $strict && is_string( $needle ) && ( is_float( $item ) || is_int( $item ) ) ) {
$item = (string)$item;
}
// ----------------------------------------------------------
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
最后,如果你需要评估真正的子字符串匹配(例如,查找"example"
到字符串"this is a example"
),函数是这样的:
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
// cast $item to string if numeric when doing weak comparison
if( ! $strict && is_string( $needle ) && ( is_float( $item ) || is_int( $item ) ) ) {
$item = (string)$item;
}
// ----------------------------------------------------------
// Substring search
if( is_string( $needle ) && is_string( $item ) && strpos( $item, $needle ) !== false ) {
return true;
}
// ----------------
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
Compete演示代码可用here