Если вы являетесь гуаром anteed уникальных значений в массиве, вы могли бы сделать array_flip для обмена ключей и значений, а затем array_filter, затем array_flip снова
$_a = array_flip($a);
$_a = array_filter($_a,function($val){
if(false === strpos($val,".")){
return true;
}
return false;
});
$a = array_flip($_a);
Если нет, то вы могли бы использовать array_walk обнулять дочерние значения, а затем использовать array_filter. Если null - это возможное значение для родителей (или что-либо, что разрешает false), вы всегда можете выбрать свой собственный для использования для детей и фильтровать по нему. Если такого значения вы не можете использовать, это решение не будет работать.
$_a = $a;
array_walk($_a,function(&$val,$key){
if(false !== strpos($val,".")){
$val = null;
}
});
$a = array_filter($_a);
Вы также можете использовать array_keys, array_filter и array_intersect_keys. Это будет работать независимо от того, являются ли значения уникальными и, в отличие от второго решения, будет работать, если родительское значение равно null.
$_a = array_keys($a);
$_a = array_filter($_a,function($val){
if(false === strpos($val,".")){
return true;
}
return false;
});
$_a = array_flip($_a); //1=>foo, 2=>bar becomes foo=>1, bar=>2
$a = array_intersect_keys($a,$_a);
Я знаю, что часто предпочтительнее использовать функции массива, когда это возможно, но я не уверен, что если какой-либо из указанных выше решений будет лучше, чем просто Еогеасп:
$_a = [];
foreach($a as $k=>$v){
if(false === strpos($k,".")){
$_a[$k] = $v;
}
}
Однако, ваш оригинальный вопрос спросил, как использовать array_filter, поэтому я представил различные варианты его использования. Как утверждали другие, однако, если вам нужно фильтровать на основе значения ключа, нет никакого способа сделать это с помощью JUST array_filter
Что у вас есть? – jeroen
Вы не можете использовать функцию 'array_filter()' PHP, потому что она только фильтрует значения, так что вы пробовали простой цикл foreach()? –