多维数组中的PHP字符串搜索

时间:2018-02-20 15:11:49

标签: php arrays string multidimensional-array string-search

我刚刚开始讨论与Pinterest相关的PHP(新的PHP)编码。我坚持对多维数组进行字符串搜索。我做了很多研究并尝试了不同的东西,但是在针对多维数组的字符串搜索方面找不到多少帮助。

具体来说,我在此帖子中尝试了递归数组搜索 in_array() and multidimensional array ,但它对我不起作用。也许我做错了什么,这就是为什么我在这里寻求一些PHP专家的帮助。

当我针对我的多维数组(下面提到)运行它时,我每次都会得到答案,并且无关紧要我指定的字符串。

例如:如果我运行下面的代码,并且它说找到了,虽然它应该说找不到,因为我的多维数组中有 Irix 字。

"Pear"

下面是我的多维数组:

echo in_array_r("Irix", $info) ? 'found' : 'not found';

1 个答案:

答案 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