Как найти ключ в многомерном массиве? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть многомерный массив, и мне нужно создать функцию 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 во всех массивах и вернуть заголовок в случае найденного массива

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Вот рекурсивный случай итератора для вас, пожалуйста, обратитесь к встроенному документу для объяснения

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);

Рабочая демоверсия .

RecursiveArrayIterator - Этот итератор позволяет сбрасывать и изменять значения и ключи при переборе массивов и объектов так же, как ArrayIterator . Кроме того, можно выполнять итерацию по текущей записи итератора.
RecursiveIteratorIterator - Может использоваться для перебора рекурсивных итераторов.
RecursiveIteratorIterator :: getInnerIterator : Получить внутренний итератор

0 голосов
/ 29 мая 2019

вам нужно сделать свою функцию рекурсивной

Демо: 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);
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...