#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! Спасибо!