За последние 24 часа нас посетили 48554 программиста и 1729 роботов. Сейчас ищет 621 программист ...

Найти id по имени в массиве

Тема в разделе "PHP для новичков", создана пользователем Geebrox, 3 авг 2018.

  1. Geebrox

    Geebrox Активный пользователь

    С нами с:
    30 июл 2016
    Сообщения:
    24
    Симпатии:
    1
    Всем привет, помогите реализовать функцию нахождение id водителя по имени в массиве.

    У меня массив заполнен таким образом:
    PHP:
    1.     $cache = $database -> query("SELECT * FROM " . DATABASE_DRIVERS_TABLE);
    2.  
    3.     if($cache -> num_rows == 0)
    4.     {
    5.         $database -> close();
    6.         exit("Error: Drivers table is empty!");
    7.     }
    8.  
    9.     while($row = $cache -> fetch_assoc())
    10.     {
    11.         $GLOBALS['drivers_list'][$row['id']] = array('name' => $row['name'], 'truck' => $row['truck'], 'trailer' => $row['trailer'], 'phone' => $row['phone']);
    12.     }
    Массив заполняется (проверял).

    Ещё у меня есть функция:
    PHP:
    1.     public function GetNameFromID($id, &$name)
    2.         {  
    3.             if(!isset($GLOBALS['drivers_list']))
    4.             {
    5.                 DriverController::FillDriversList();
    6.             }
    7.  
    8.             $name = $GLOBALS['drivers_list'][$id]['name'];
    9.         }
    Эта функция тоже работает нормально (проверял)

    Но мне нужна ещё одна функция которая узнаёт id водителя через переданное имя и записывает его в переменную что-то вроде такого: public function GetIDByName($name, &$id). Но как бы я не морочился у меня не получается правильно реализовать эту функцию. Не могу узнать id текущего массива если даже нахожу имя. Пытался сделать такое:
    PHP:
    1.     foreach($GLOBALS['drivers_list'] as $driver)
    2.     {
    3.         if(strcmp($driver['name'], 'Ramazon Murodov') == 0)
    4.         {
    5.             //дальше трабла
    6.         }
    7.     }
    Прощу вас помочь. И если не сложно заодно посоветуйте улучшение для уже имеющихся функций или покритикуйте где я бы смог сделать лучше и удобнее. Спасибо!
     
    #1 Geebrox, 3 авг 2018
    Последнее редактирование: 3 авг 2018
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.860
    Симпатии:
    657
    Задавайте критерий отбора еще на стадии формирования запроса. Имен может быть найдено несколько, если соотв. поле не уникальное.
    --- Добавлено ---
    Отсеивать лишние также можно еще на стадии выполнения запроса: LIMIT 1.
     
  3. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Избавьтесь от "$var -> prop" на "$var->prop"
    Зачем вы сюда пихаете $GLOBALS['drivers_list'][$row['id']] ?
    Зачем по ссылку передаёте аргумент в функции?

    PHP:
    1. public function GetIDByName($name) {
    2.   foreach($this->drivers as $driver) {
    3.    if($driver['name'] == $name) return $driver;
    4.    return false;
    5.   }
    6. }
     
    Geebrox нравится это.
  4. Geebrox

    Geebrox Активный пользователь

    С нами с:
    30 июл 2016
    Сообщения:
    24
    Симпатии:
    1
    Спасибо за ответы

    Вот эту часть не понял
    --- Добавлено ---
    Имен может быть несколько, но ID водителя разное (уникальное автоинкремент)
     
  5. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Если приходит массив name то перебираешь его если нет то только по одному.
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.860
    Симпатии:
    657
    @Geebrox, я о том, что вы должны возвращать список идентификаторов или не допускать возможность совпадения имен в таблице.