【问题标题】:PHP: Check if array contains another array values (in specific order)PHP:检查数组是否包含另一个数组值(按特定顺序)
【发布时间】:2013-10-29 20:06:26
【问题描述】:

我有一个数组:

$haystack = array(1,2,3,4,5,6,7,8,9,10...);
$needle = array(3,4,5);
$bad_needle = array(3,5,4);

如果我检查 haystack 是否包含针,我需要得到 true。但如果我检查 haystack 是否包含 bad_needle,我也需要 false。 没有 foreach 的小费适用于所有干草堆和针?

【问题讨论】:

标签: php arrays


【解决方案1】:
$offset = array_search($needle[0], $haystack);
$slice  = array_slice($haystack, $offset, count($needle));
if ($slice === $needle) {
    // yes, contains needle
}

如果$haystack 中的值不是唯一的,这将失败。在这种情况下,我会选择一个不错的循环:

$found  = false;
$j      = 0;
$length = count($needle);

foreach ($haystack as $i) {
    if ($i == $needle[$j]) {
        $j++;
    } else {
        $j = 0;
    }
    if ($j >= $length) {
        $found = true;
        break;
    }
}

if ($found) {
    // yes, contains needle
}

【讨论】:

    【解决方案2】:
    var_dump(strpos(implode(',', $haystack), implode(',', $needle)) !== false);
    
    var_dump(strpos(implode(',', $haystack), implode(',', $bad_needle)) !== false);
    

    一个工作的 array_slice() 仍然需要一个循环,只要我能解决:

    foreach(array_keys($haystack, reset($needle)) as $offset) {
        if($needle == array_slice($haystack, $offset, count($needle))) {
            // yes, contains needle
            break;
        }
    }
    

    【讨论】:

    • 请问,这应该比 array_slice 快吗?
    • @Anette D.:我没有计时,但它不会像数组 slice() 示例那样失败。
    • Array_slice 适用于您的具体示例,但不适用于:$haystack = array(1,2,3,3,4,5,6,7,8,9,10);
    • 添加了工作 array_slice()。不应该使用 $needle[0] 因为它可以是任何数字或关联。
    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 2021-06-06
    • 2021-07-02
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多