如果value是另一个值的子字符串,则从数组中删除值

时间:2013-11-04 00:28:13

标签: php

Array
(
    [0] => tt0087523
    [1] => cehennem melekleri
    [3] => euer weg führt durch die hölle
    [5] => guerreiros selvagens
    [7] => jungel krigerne
    [9] => jungle fever
    [11] => jungle warriors
    [17] => jungle warriors euer weg führt durch die hölle
    [19] => la guerra de la coca
    [21] => les guerriers de la jungle
    [23] => los guerreros de la jungla
    [25] => the czar of brazil
    [27] => viidakkosoturit
)

如何删除作为另一个值的子字符串的所有值。例如,删除索引[3],因为它是[17][11]的子字符串,因为它也是17的子字符串。

我正在为文本搜索构建一个字符串,并希望它尽可能短。

更新:re:评论:)

foreach ($array as $i => $value) {
    foreach ($array as $j => $search) {
        if ($i === $j) continue;
        if (false !== stripos($search, $value)) {
            unset($array[$i]);
        }
    }
}

3 个答案:

答案 0 :(得分:4)

怎么样......

array_walk($array, function(&$v,$k,&$a) {
  if(count(preg_grep('~'.preg_quote($v,'~').'~i',$a))>1)unset($a[$k]);
},&$array);

编辑

我在php 5.3.22中对此进行了测试,并且通过引用传递的函数已被5.4删除,因此OP建议,这里是5.4+ alt:

array_walk($array, function (&$v, $k) use (&$array) { 
  if(count(preg_grep('~'.preg_quote($v,'~').'~i', $array))>1)unset($array[$k]); 
});

答案 1 :(得分:2)

您可以使用两个循环来检查字符串是否为substr:

$array = array(
"0" => "tt0087523",
"1" => "cehennem melekleri",
"3" => "euer weg führt durch die hölle",
"5" => "guerreiros selvagens",
"7" => "jungel krigerne",
"9" => "jungle fever",
"11" => "jungle warriors",
"17" => "jungle warriors euer weg führt durch die hölle",
"19" => "la guerra de la coca",
"21" => "les guerriers de la jungle",
"23" => "los guerreros de la jungla",
"25" => "the czar of brazil",
"27" => "viidakkosoturit");

foreach($array as $key => $value){
    foreach($array as $key2 => $value_to_compare){
        if($key2 == $key)
            continue;

        $pos = strpos($value_to_compare, $value);

        if($pos !== false){
            unset($array[$key]);
        }
    }
}

print_r($array);
/*

Array
(
    [0] => tt0087523
    [1] => cehennem melekleri
    [5] => guerreiros selvagens
    [7] => jungel krigerne
    [9] => jungle fever
    [17] => jungle warriors euer weg führt durch die hölle
    [19] => la guerra de la coca
    [21] => les guerriers de la jungle
    [23] => los guerreros de la jungla
    [25] => the czar of brazil
    [27] => viidakkosoturit
)

*/

答案 2 :(得分:0)

蜡笔的array_walk是一个简洁的解决方案,除了unset()更改数组索引并导致array_walk跳过记录,因此可以留下一些重复。

使用空字符串替换该值,而不是unset(),并在遍历后运行array_filter以删除空值。

array_walk($array, function (&$v, $k) use (&$array) { 
  if(count(preg_grep('~'.preg_quote($v,'~').'~i', $array))>1)unset($array[$k]); 
    $array[$i] = '';
});
$array = array_filter($array);