2017-04-04 156 views
0

我正在寻找一种与in_array相同的替代函数,但它也可以检查搜索项是否仅包含给定元素的一部分而不是整个元素:PHP如何检查数组是否包含另一个数组的模式

目前与下面的脚本工作:

$attributes = array('dogs', 'cats', 'fish'); 

    if (in_array($attributes, array('dog','cats','fishess'), true)) { 

    * does something for cats, but not for dogs and fish 
     because the function only checks if the given term is identical to the word in the array instead of only a part of the word * 
} 

我将如何建立我起来的功能,使其通过的话只包含在阵列藏汉文字的部分?

首选的例子是这个样子:

$words = array('fish', 'sharks'); 

if (*word or sentence part is* in_array($words, array('fishing', 'sharkskin')){ 

return 'your result matched 2 elements in the array $words 

} 
+0

http://php.net/manual/en/function.array-intersect.php – mkaatman

+1

更妙的是HTTP:// PHP。 net/manual/en/function.array-uintersect.php – dan08

+0

这类问题的一个重要细节是针阵列的大小和干草堆阵列的大小是多少。根据这些尺寸,如果性能很重要,答案可能完全不同。 –

回答

0

你可以使用:

array_filter($arr, function($v, $k) { 
    // do whatever condition you want 
    return in_array($v, $somearray); 
}, ARRAY_FILTER_USE_BOTH); 

数组中的每一项调用这个函数$arr一个功能,您可以自定义,你的情况检查你是否在另一个阵列元素

0

为什么不只是使自己的一段代码/功能?

foreach ($item in $attributes) { 
    foreach ($item2 in array('dog','cats','fishess')) { 
     // Check your custom functionality. 
     // Do something if needed. 
    } 
} 

你可以看看array_intersect,但它不会检查模式匹配(你莫名其妙地提到?)

array_intersect()返回一个包含了array1的所有值的数组这是存在于所有论据中的。请注意,键被保留。

foreach (array_intersects($attributes, array('dog','cats','fishess') { 
    // do something. 
} 
1

将溶液使用array_filterpreg_grep功能:

$words = ['fish', 'sharks', 'cats', 'dogs']; 
$others = ['fishing', 'sharkskin']; 

$matched_words = array_filter($words, function($w) use($others){ 
    return preg_grep("/" . $w . "/", $others); 
}); 

print_r($matched_words); 

输出:

Array 
(
    [0] => fish 
    [1] => sharks 
) 
1

尝试下面的代码:

<?php 
$what = ['fish', 'sharks']; 
$where = ['fishing', 'sharkskin']; 

foreach($what as $one) 
    foreach($where as $other) 
     echo (strpos($other, $one)!==false ? "YEP! ".$one." is in ".$other."<br>" : $one." isn't in ".$other."<br>"); 
?> 

希望它可以帮助=}

+0

这是没有技巧的基本方法(因为循环是明确的,并且因为您使用了足够执行此任务的“strpos”)。然而,不要显示狗屎(并假设用户需要html),最好返回一个已过滤的数组。 –

+0

您好@CasimiretHippolyte,我相信他会更好地使用结果,我已经显示了一些狗屎,因为他可以运行此代码(无需修改它)并查看它是否适合他的问题...有时简单性更聪明.. 。 – rafsb

0

我会去:

$patterns = array('/.*fish.*/', '/.*sharks.*/'); 
$subjects = array('fishing', 'aaaaa', 'sharkskin'); 
$matches = array(); 
preg_replace_callback(
    $patterns, 
    function ($m) { 
     global $matches; 
     $matches[] = $m[0]; 
     return $m[0]; 
    }, 
    $subjects 
); 

print_r($matches); // Array ([0] => fishing [1] => sharkskin) 
+0

没有什么可以替代的,不要使用'preg_replace ...',不管用什么原因都不要使用'global'。 –

+0

@CasimiretHippolyte为什么不使用全球?这是一种语言功能;)很显然,preg取代回调函数,它被用于不同的原因。 – bluehipy

相关问题