У меня есть многомерный массив, и мне нужно создать функцию searchCategory($categories, $id), которая должна возвращать значение свойств title.
попробуйте этот код, он работает, но только для одного слоя многомерного массива.
Многомерный массив:
$categories = array( array(
"id" => 1,
"title" => "Обувь",
'children' => array(
array(
'id' => 2,
'title' => 'Ботинки',
'children' => array(
array('id' => 3, 'title' => 'Кожа'),
array('id' => 4, 'title' => 'Текстиль'),
),
),
array('id' => 5, 'title' => 'Кроссовки',),
)), array(
"id" => 6,
"title" => "Спорт",
'children' => array(
array(
'id' => 7,
'title' => 'Мячи'
)
) ), );
Код, который я пытаюсь решить проблему:
function searchCategory($categories, $id) {
foreach($categories as $category) {
if ($category['id'] == $id) {
echo $category['title'] . '<br>';
}
}
};
Мне нужна моя функция для поиска значения id во всех массивах и возврата заголовка в случае найденного массива
Вот случай рекурсивного итератора для вас, пожалуйста, просмотрите встроенный документ для объяснения
function searchCategory($categories, $id)
{
$arrayiter = new RecursiveArrayIterator($categories);
$iteriter = new RecursiveIteratorIterator($arrayiter);
foreach ($iteriter as $key => $value) {
// checking if iterator comes to point where key is id and value matched
if ($key == 'id' && $value == $id) {
// returning matched value with current iterator instance
return $iteriter->getInnerIterator()['title'];
}
}
return '';
}
echo searchCategory($categories, 2).'<br/>';
echo searchCategory($categories, 7);
Рекурсивный массивИтератор — этот итератор позволяет сбрасывать и изменять значения и ключи при переборе массивов и объектов так же, как Итератор массива. Кроме того, можно перебирать текущую запись итератора.
Рекурсивныйитераторитератор — может использоваться для перебора рекурсивных итераторов.
RecursiveIteratorIterator::getInnerIterator: Получить внутренний итератор
вам нужно сделать вашу функцию рекурсивно
Демонстрация: https://3v4l.org/CR7CD
function searchCategory($categories, $id) {
foreach($categories as $category) {
if ($category['id'] == $id)
echo $category['title'] . '<br>';
if (isset($category['children']))
searchCategory($category['children'],$id);
}
}
Вам не хватает еще одного цикла foreach для перебора элементов во внутренних массивах. Попробуйте сделать это:
foreach ($category as $key=>$value) { echo "$key: $value }