Проверьте, является ли элемент многомерного массива самим массивом

#php #arrays

#php #массивы

Вопрос:

Я пытаюсь создать процедуру, которая выводит навигационное меню в зависимости от статуса пользователя. Ему необходимо передать переменную вложенного массива (company => role), которая выглядит следующим образом:

 array(2) {
  ["Company 1"]=>
  array(2) {
    [0]=>
    string(3) "dir"
    [1]=>
    string(5) "manag"
  }
  ["company 2"]=>
  string(3) "dir"
}
 

Предполагается, что у пользователя может быть несколько ролей.

Теперь моя процедура (упрощенная версия, просто чтобы показать, что логика не работает):

 function get_menu_1  ($status) {

        foreach ($status as $company => $position) {
            $a = is_array($company); //THIS ALWAYS RETURNS FALSE this is for debugging
            echo "<br>this element is array = $a<br>"; //this is for debugging
            if (true == is_array($company)) { // THIS ALWAYS RETURNS FALSE this user in this company has multiple roles

                foreach ($company as $subcompany => $subposition) {
                    echo "<br>$subposition<br>";
                }
            } else { //its not an array, user has one role in the company

                echo "<br>$position<br>";
            }

        }

    }
 

Вывод:

 Notice: Array to string conversion in /sata2/home/users/xreact/www/cert.xreact.org/functions.php on line 393

Array

this element is array = 

dir
array(2) { ["Company 1"]=> array(2) { [0]=> string(3) "dir" [1]=> string(5) "manag" } ["Company 2"]=> string(3) "dir" }
 

По какой-то причине is_array() не удается проверить, является ли переменная массивом.

Комментарии:

1. Вы можете попытаться добавить позиции в виде массива независимо от того, есть ли только одна позиция.

Ответ №1:

вы проверяете, является ли ваш ключ массива самим массивом, но этого не может быть.

вместо этого вы должны проверить значение.

 foreach ($status as $company => $position) {
    echo is_array($company); //will allways be false, because the array key is a string.
    //in your examples, "Company 1" or "Company 2";
    if(is_array($position)) {
        echo "here you have your nested array";
    }
}
 

Редактировать

кроме того, на узле сайта: вы можете обойти проверку все вместе, если немного улучшите свою структуру данных. вместо того, чтобы хранить одну роль в виде строки, вы можете сохранить ее как массив с одним строковым элементом — так что ваше значение массива всегда является массивом:

 $data = array(
    "Company 1"=>array("dir", "manag"),
    "Company 2"=>array("dir")
);
 

Комментарии:

1. Заполненный промозглый, но он не работает. Сама проверка возвращает false, и во внутреннем foreach я получаю предупреждение: Invalid argument supplied for foreach() Что касается вашего предложения об изменении структуры данных, это определенно хороший и более эффективный способ, однако сейчас его довольно сложно реализовать.

2. Понял, он также должен был указывать позицию для foreach! Спасибо!