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]);
}
}
}
答案 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);