За последние 24 часа нас посетили 22679 программистов и 1547 роботов. Сейчас ищут 926 программистов ...

Правильный массив из БД

Тема в разделе "PHP для новичков", создана пользователем SamyRed, 2 май 2017.

  1. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Здрасвтвуйте. Что-то я завис совсем.
    Есть таблица в БД с полями:
    id, group_id, permission, value
    и значениями, например:
    1, 4, add_new, 1
    2, 4, edit_new, 1
    Как получить массив вида:
    array (
    'add_new' => 1,
    'edit_new' => 1
    );?
    Пытался делать как-то так:
    PHP:
    1. function userPerm ($perm) {
    2.     global $db;
    3.     $groupID = user ()['group_site'];
    4.     $q = $db->query ("SELECT * FROM `permissions_site` WHERE `group_id` = '$groupID'");
    5.     if ($q) {
    6.         if ($q->num_rows) {
    7.             while ( $perms[] = $q->fetch_assoc ());
    8.  
    9. //========Вот такой массив получается:
    10.  
    11. //array(3) {
    12. //  [0]=> array(4) {
    13. //      ["id"]=> string(1) "1"
    14. //      ["group_id"]=> string(1) "4"
    15. //      ["permission"]=> string(8) "add_news"
    16. //      ["value"]=> string(1) "1"
    17. //  }
    18. //  [1]=> array(4) {
    19. //      ["id"]=> string(1) "2"
    20. //      ["group_id"]=> string(1) "4"
    21. //      ["permission"]=> string(9) "edit_news"
    22. //      ["value"]=> string(1) "1"
    23. //  }
    24. //  [2]=> NULL
    25. //}
    26.  
    27. //==============
    28.  
    29.             $i = 0;
    30.             while ($item = $perms) {
    31.                 $perms1[$perms[$i]['permission']] = $perms[$i]['permission'];
    32.                 $perms1[$perms[$i]['value']] = $perms[$i]['value'];
    33.                 $i++;
    34.             }
    35.             return $perms1;
    36.         } else {
    37.             return 'Error! user (): Bad query';
    38.         }
    39.     } else {
    40.         return null;
    41.     }
    42. }
    Но на втором цикле php сообщает мне что цикл выполняется более 10-ти секунд:
    Код (Text):
    1.  
    2. Fatal error: Maximum execution time of 10 seconds exceeded in МОЙСАЙТ/service/functions.php on line 73
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Тут точно оператор присвоения должен быть? Ну или точно присвоегое $perms? Так-то, глядя в твой код, я вижу вечный цикл. Ну то есть ты, конечно, перебираешь там элементы массива через зачем-то вынесенный счетчик, но в условии-то ты занимаешься присвоением массива, который во время перебора никак не меняется.
    --- Добавлено ---
    Еще и переменную $items не используешь. Может, стоит отрефакторить этот фрагмент?
     
    TeslaFeo нравится это.
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Понял свою ошибку. Вышел на то, что у меня получился вот такой массив:
    Код (Text):
    1.  
    2. array(4) {
    3.     ["add_news"] => string(8) "add_news"
    4.     [1] => string(1) "1"
    5.     ["edit_news"] => string(9) "edit_news"
    6.     [""]=> NULL
    7. }
    Я конечно понимаю, что я могу насильно удалять эти "лишние" эллементы ([1] => string(1) "1" и [""]=> NULL), но понять бы откуда они берутся?! Если я правильно понимаю, то "тайна" кроется здесь:
    Код (Text):
    1. while ( $perms[] = $q->fetch_assoc ());
    , но ничего другого придумать немогу чтобы получить из БД двухмерный ассоциативный массив.
    --- Добавлено ---
    Сейчас получаю его так:
    PHP:
    1.             $i = 0;
    2.             $count = count ($perms);
    3.             while ($i <= $count) {
    4.                 $perms1[$perms[$i]['permission']] = $perms[$i]['permission'];
    5.                 $perms1[$perms[$i]['value']] = $perms[$i]['value'];
    6.                 $i++;
    7.             }
     
  4. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Точнее вот так делаю:
    PHP:
    1.             $i = 0;
    2.             $count = count ($perms);
    3.             while ($i <= $count) {
    4.                 $perms1[$perms[$i]['permission']] = $perms[$i]['value'];
    5.                 $i++;
    6.             }
    и получаю такой массив:
    Код (Text):
    1.  
    2. //array(3) {
    3. //    ["add_news"]=> string(1) "1"
    4. //    ["edit_news"]=> string(1) "1"
    5. //    [""]=> NULL
    6. //}
    --- Добавлено ---
    То есть только последний эллемент лишний.
    --- Добавлено ---
    Я решил проблему вот так:
    PHP:
    1.             $i = 0;
    2.             $count = count ($perms);
    3.             while ($i <= $count) {
    4.                 if ($perms[$i]['value'] == NULL) {
    5.                     $i++;
    6.                     continue;
    7.                 }
    8.                 $perms1[$perms[$i]['permission']] = $perms[$i]['value'];
    9.                 $i++;
    10.             }
    но мне как-то не нравится такой вариант, т.к. это напоминает мне костыль. Как получить нормальный массив без этого эллемента изначалоно?
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Еще и переменную $items не используешь. Может, стоит отрефакторить этот фра
    Ну дык не пиши значение сразу в массив. Пиши во временную переменную. А в теле цикла из нее в массив. Делов-то. А еще можно заюзать это.
     
  6. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Если ты имел ввиду так:
    PHP:
    1.             while ($item = $q->fetch_assoc ()) {
    2.                 $perms[] = $item;
    3.             }
    то ничего не поменялось. Возвращает:
    Код (Text):
    1. array(3) { ["add_news"]=> string(1) "1" ["edit_news"]=> string(1) "1" [""]=> NULL }
    --- Добавлено ---
    В общем. вот так получилось:
    PHP:
    1. function userPerm ($perm) {
    2.     global $db;
    3.     $groupID = user ()['group_site'];
    4.     $q = $db->query ("SELECT * FROM `permissions_site` WHERE `group_id` = '$groupID'");
    5.     if ($q) {
    6.         if ($q->num_rows) {
    7.             $perms = $q->fetch_all ();
    8. //array(2) {
    9. //    [0]=> array(4) {
    10. //        [0]=> string(1) "1"
    11. //        [1]=> string(1) "4"
    12. //        [2]=> string(8) "add_news"
    13. //        [3]=> string(1) "1"
    14. //    }
    15. //    [1]=> array(4) {
    16. //        [0]=> string(1) "2"
    17. //        [1]=> string(1) "4"
    18. //        [2]=> string(9) "edit_news"
    19. //        [3]=> string(1) "1"
    20. //    }
    21. //}
    22.             $i = 0;
    23.             foreach ($perms as $item) {
    24.                 $perms1[$perms[$i][2]] = $perms[$i][3];
    25.                 $i++;
    26.             }
    27.             return $perms1;
    28.         } else {
    29.             return 'Error! user (): Bad query';
    30.         }
    31.     } else {
    32.         return null;
    33.     }
    34. }
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А, ну значит у тебя есть данные с пустым ключом.
     
  8. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Нет там таких данных. В таблице всего 2 строки, которые возвращаются правильно при использовании последнего варианта.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Дебажь, что еще сказать.. Дебаггером, а не вардампами.
     
  10. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Зачем дебажить то, если я нашёл другой выход, который меня устраивает, да и костыль, в принципе, не напоминает)