4
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

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

更新:回复:评论:)

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

3 回答 3

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]); 
});
于 2013-11-04T01:07:07.767 回答
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
)

*/
于 2013-11-04T00:45:14.880 回答
0

Crayon 的 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);
于 2014-08-09T14:17:55.410 回答