Intereting Posts
Лучший способ обработки ошибок Создайте уникальный уникальный токен csrf в Symfony Использование моего собственного API Laravel Как безопасно хранить пароли, используемые для входа на сторонние веб-сайты Почему так называемые «ави» Twitter настолько медленны? Как заполнить второе раскрывающееся меню на основе выбора первого раскрывающегося списка с использованием jQuery / AJAX и PHP / MySQL? Сортировка массива зависит от других значений ключей массива Неустранимая ошибка: нельзя использовать возвращаемое значение функции в контексте записи Какова наилучшая практика для PHP постоянно проверять изменения в базе данных? Где я должен сохранить свои файлы css и js в проекте Symfony? Ошибка сертификата SSL в cURL Как проверить, включен ли mod_rewrite в php? Невозможно отобразить греческие символы .mdb file (PHP & ODBC) Что означает? == оператор сравнения в PHP означает? Что означает «массовое присвоение» в Ларавеле?

Как сопоставить числа в массиве в PHP

Я работаю над маршрутизацией или uri в моем приложении PHP. В настоящее время у меня есть массив с regex => url map, подобный этому …

<?php $uri_routes = array( //users/account like http://mysite.com/users/324 (any digit) 'users/friends/page-(\d+)' => 'modules/users/friends/page-$1', 'users/friends/' => 'modules/users/friends/', 'users/online' => 'modules/users/online/' , 'users/online/page-(\d+)' => 'modules/users/online/page-$1', 'users/create' => 'modules/users/create', 'users/settings' => 'modules/users/settings', 'users/logout(\d+)' => 'modules/users/logout', 'users/login' => 'modules/users/login', 'users/home' => 'modules/users/home', //forums 'forums/' => 'modules/forums/index', 'forums/viewthread/(\d+)' => 'modules/forums/viewthread/$1', 'forums/viewforum/(\d+)' => 'modules/forums/viewforum/$1', 'forums/viewthread/(\d+)/page-(\d+)' => 'modules/forums/viewthread/$1/page-$2', 'forums/viewforum/(\d+)/page-(\d+)' => 'modules/forums/viewforum/$1/page-$2' //blog routes coming soon //mail message routes coming soon //various other routes coming soon ); ?> 

Затем я могу выполнить цикл в моем массиве карт $ uri_routes и сопоставить uri с preg_match () следующим образом …

 <?php //get url from URL $uri = isset($_GET['uri']) ? $_GET['uri'] : null; //runs our function and returns an array // $uri['module'] this will be the class/module/section // $uri['method'] this will be the page in that section or method in that class // $uri['urifragments'] this will either page a user ID, or an item ID or a page number for paging $uri = get_route($_GET['uri'],$uri_routes); function get_route($uri,$uri_routes) { foreach($uri_routes as $rUri => $rRoute) { if(preg_match("#^{$rUri}$#Ui",$uri)) { $uri = preg_replace("#^{$rUri}$#Ui",$rRoute,$uri); break; } } $uri = explode('/',$uri); $return['module'] = $uri['1']; $return['method'] = $uri['2']; $return['urifragments'] = $uri['3']; $return['urifragments2'] = $uri['4']; return $return; } 

Я открыт для предложения улучшить это в любом случае. Прямо сейчас я застреваю, так как есть 4 возможных значения / значения массива. Если ключ массива 3 или ключ 4 содержит слово «страница-», за которым следует число, я хотел бы присвоить его переменной $ page. Но если ключ 3 или ключ 4 содержит только число без слова «page-», я могу предположить, что это идентификатор пользователя, идентификатор блога, идентификатор форума и т. Д. И присваивает ему переменную $ id.

Если вы знаете хороший подход к этому, пожалуйста, помогите.

ОБНОВИТЬ
для упрощения вещей, помимо наличия «страницы» перед номерами страниц, я мог бы иметь «id-» перед номерами идентификаторов

Вместо того, чтобы использовать $1 и $2 для соответствия нашим маршрутам, попробуйте использовать именованные записи.

5.2.2 Именованные подшаблоны теперь принимают синтаксис (?) И (? 'Name'), а также (? P). Предыдущие версии принимаются только (? P). Источник: preg_match

Также, когда вы делаете preg_replace, вы используете \ [0-99], где \ 0 – целая строка и от 1 до 99 совпадают.

Но если вы собираетесь использовать именованные захваты, вы можете назначить массив параметру $replacement с захватом имени (например, если вы запишете ?P<page> тогда вы передадите array('page'=>"new value of page") ).

Надеюсь, это поможет.