$needle = "sun";
$filteredArr = array_filter(
$arr,
function($v) use ($needle) {
foreach($v['children'] as $child) {
// "Version 1" of filtering, no "parts of strings" searches
if (in_array($needle, $child['painting'])) {
return true;
}
// "Version 2" of filtering, keyword may be part of a painting string
foreach($child['painting'] as $painting) {
if (strpos($painting, $needle) !== false) {
return true;
}
}
}
return false;
}
);
Если вы используете функцию обратного вызова для array_filter (), тогда вы можете выполнять довольно сложные фильтрации.
Редактировать Новая версия ответа для удаления записей в массивах рисования, не соответствующихpattern.
Это работает, выполняя вложенные циклы foreach, вплоть до самого внутреннего необходимого массива, painting в этом случае.Массив painting фильтруется, поэтому все несоответствующие элементы в нем удаляются.Когда это сделано, на следующем уровне наружу проверяется массив painting , и, если он пуст, тип удаления "распространяется наружу".Таким образом, должны быть оставлены только записи с соответствующими записями рисования, и они должны быть как бы масштабируемыми.
Ссылки не являются строго необходимыми, вместо этого можно добавить переменные ключа массива в циклы foreach.Но мне не понравилась вся эта индексация.
$needle = 'sun';
foreach($arr as $entryKey => &$entry) {
foreach($entry['children'] as $childKey => &$child) {
foreach($child['painting'] as $paintingKey => $painting) {
if (strpos($painting, $needle) === false) {
unset($child['painting'][$paintingKey]);
}
}
if (empty($child['painting'])) {
unset($entry['children'][$childKey]);
}
}
if (empty($entry['children'])) {
unset($arr[$entryKey]);
}
}
unset($entry, $child); // Take no risks with references