Здрасвтвуйте. Что-то я завис совсем. Есть таблица в БД с полями: id, group_id, permission, value и значениями, например: 1, 4, add_new, 1 2, 4, edit_new, 1 Как получить массив вида: array ( 'add_new' => 1, 'edit_new' => 1 );? Пытался делать как-то так: PHP: function userPerm ($perm) { global $db; $groupID = user ()['group_site']; $q = $db->query ("SELECT * FROM `permissions_site` WHERE `group_id` = '$groupID'"); if ($q) { if ($q->num_rows) { while ( $perms[] = $q->fetch_assoc ()); //========Вот такой массив получается: //array(3) { // [0]=> array(4) { // ["id"]=> string(1) "1" // ["group_id"]=> string(1) "4" // ["permission"]=> string(8) "add_news" // ["value"]=> string(1) "1" // } // [1]=> array(4) { // ["id"]=> string(1) "2" // ["group_id"]=> string(1) "4" // ["permission"]=> string(9) "edit_news" // ["value"]=> string(1) "1" // } // [2]=> NULL //} //============== $i = 0; while ($item = $perms) { $perms1[$perms[$i]['permission']] = $perms[$i]['permission']; $perms1[$perms[$i]['value']] = $perms[$i]['value']; $i++; } return $perms1; } else { return 'Error! user (): Bad query'; } } else { return null; } } Но на втором цикле php сообщает мне что цикл выполняется более 10-ти секунд: Код (Text): Fatal error: Maximum execution time of 10 seconds exceeded in МОЙСАЙТ/service/functions.php on line 73
Тут точно оператор присвоения должен быть? Ну или точно присвоегое $perms? Так-то, глядя в твой код, я вижу вечный цикл. Ну то есть ты, конечно, перебираешь там элементы массива через зачем-то вынесенный счетчик, но в условии-то ты занимаешься присвоением массива, который во время перебора никак не меняется. --- Добавлено --- Еще и переменную $items не используешь. Может, стоит отрефакторить этот фрагмент?
Понял свою ошибку. Вышел на то, что у меня получился вот такой массив: Код (Text): array(4) { ["add_news"] => string(8) "add_news" [1] => string(1) "1" ["edit_news"] => string(9) "edit_news" [""]=> NULL } Я конечно понимаю, что я могу насильно удалять эти "лишние" эллементы ([1] => string(1) "1" и [""]=> NULL), но понять бы откуда они берутся?! Если я правильно понимаю, то "тайна" кроется здесь: Код (Text): while ( $perms[] = $q->fetch_assoc ()); , но ничего другого придумать немогу чтобы получить из БД двухмерный ассоциативный массив. --- Добавлено --- Сейчас получаю его так: PHP: $i = 0; $count = count ($perms); while ($i <= $count) { $perms1[$perms[$i]['permission']] = $perms[$i]['permission']; $perms1[$perms[$i]['value']] = $perms[$i]['value']; $i++; }
Точнее вот так делаю: PHP: $i = 0; $count = count ($perms); while ($i <= $count) { $perms1[$perms[$i]['permission']] = $perms[$i]['value']; $i++; } и получаю такой массив: Код (Text): //array(3) { // ["add_news"]=> string(1) "1" // ["edit_news"]=> string(1) "1" // [""]=> NULL //} --- Добавлено --- То есть только последний эллемент лишний. --- Добавлено --- Я решил проблему вот так: PHP: $i = 0; $count = count ($perms); while ($i <= $count) { if ($perms[$i]['value'] == NULL) { $i++; continue; } $perms1[$perms[$i]['permission']] = $perms[$i]['value']; $i++; } но мне как-то не нравится такой вариант, т.к. это напоминает мне костыль. Как получить нормальный массив без этого эллемента изначалоно?
Еще и переменную $items не используешь. Может, стоит отрефакторить этот фра Ну дык не пиши значение сразу в массив. Пиши во временную переменную. А в теле цикла из нее в массив. Делов-то. А еще можно заюзать это.
Если ты имел ввиду так: PHP: while ($item = $q->fetch_assoc ()) { $perms[] = $item; } то ничего не поменялось. Возвращает: Код (Text): array(3) { ["add_news"]=> string(1) "1" ["edit_news"]=> string(1) "1" [""]=> NULL } --- Добавлено --- В общем. вот так получилось: PHP: function userPerm ($perm) { global $db; $groupID = user ()['group_site']; $q = $db->query ("SELECT * FROM `permissions_site` WHERE `group_id` = '$groupID'"); if ($q) { if ($q->num_rows) { $perms = $q->fetch_all (); //array(2) { // [0]=> array(4) { // [0]=> string(1) "1" // [1]=> string(1) "4" // [2]=> string(8) "add_news" // [3]=> string(1) "1" // } // [1]=> array(4) { // [0]=> string(1) "2" // [1]=> string(1) "4" // [2]=> string(9) "edit_news" // [3]=> string(1) "1" // } //} $i = 0; foreach ($perms as $item) { $perms1[$perms[$i][2]] = $perms[$i][3]; $i++; } return $perms1; } else { return 'Error! user (): Bad query'; } } else { return null; } }
Нет там таких данных. В таблице всего 2 строки, которые возвращаются правильно при использовании последнего варианта.
Зачем дебажить то, если я нашёл другой выход, который меня устраивает, да и костыль, в принципе, не напоминает)