<rmcreative>

RSS

PHP, построение URL

20 мая 2011

При работе с разными API (и не только) требуется построить URL. На входе имеем массив параметров имя-значение, на выходе получаем URL. Решение очень простое:

function getUrl($url, $params = array())
{
    return $url.'&'.http_build_query($params);
}
 
// используем так
echo getUrl('http://open.mapquestapi.com/nominatim/v1/search?format=json', array('q' => 'Olympiaturm, Spiridon-Louis-Ring 7, München 80809'));

UPD: http_build_url.

Комментарии RSS

  1. №4673
    conf
    conf 20.05.2011, 21:18:46

    А если в первом параметре нет query_string?

  2. №4674
    Sergey
    Sergey 20.05.2011, 21:35:45

    функция гамнокодера :)

    1. что, если в урле нет "&"?
    2. что мешает передать это сразу в http_build_query() нужные параметры и не юзать гамнофункцию?
  3. №4675
    Sam
    Sam 20.05.2011, 22:10:58

    conf, меняем & на ?.

    Sergey,

    1. ?
    2. Ничего не мешает. Это просто пример использования http_build_query.
  4. №4676
    Sergey
    Sergey 20.05.2011, 22:51:23
    1. http://open.mapquestapi.com/nominatim/v1/search?format=json http://open.mapquestapi.com/nominatim/v1/search

    разницу между исходными урлами видите? так вот, если подать туда вторую - то получится не то что нужно )

    1. это не пример использования http_build_query, а просто пример использования функции, при чем не очень полезной :)

    удачи :)

  5. №4677
    другой Sergey :)
    другой Sergey :) 21.05.2011, 2:25:43

    Тогда уж

    function get_url($url, $params = array()) {
        $delim = '';
        // delimшter is needed only if the last character in the url is not "?" or "&"
        if (!in_array(substr($url, -1, 1), array('?', '&')))
            $delim = strpos($url, '?') ? '&' : '?';
     
        return $url . $delim . http_build_query($params);
    }

    и потестить

    $params = array('something' => 1, 'something_else' => 'two');
    $urls = array(
        'http://google.com/',
        'http://google.com/?',
        'http://google.com/index.php',
        'http://google.com/index.php?',
        'http://google.com/index.php?param=google_likes_php',
        'http://google.com/index.php?param=google_likes_php&very=much',
        '/',
        '/?',
        '/index.php',
        '/index.php?',
        '/index.php?param=google_likes_php',
        '/index.php?param=google_likes_php&very=much',
        '',
        '?',
        'index.php',
        'index.php?',
        'index.php?param=google_likes_php',
        'index.php?param=google_likes_php&very=much',
    );
     
    echo '<table border=1 padding=3>';
    foreach ($urls as $url) {
        echo "<tr><td>$url</td><td>" . get_url($url, $params) . '</td></tr>';
    }
    echo '</table>';

    такая ф-я адекватно себя ведет с различными $url

  6. №4678
    Sergey
    Sergey 21.05.2011, 2:59:48
    • 1 )
  7. №4679
    Sam
    Sam 21.05.2011, 3:40:47

    Sergey, задача была показать, что http_build_query вообще есть, а не реализовать универсальный метод. То, что другой Sergey его реализовал — это замечательно. Просто за годы работы с PHP я насмотрелся самопальных реализаций, похожих на то, что в комментариях к страничке с документацией.

  8. №4683
    Сергей
    Сергей 21.05.2011, 6:16:37

    Немножко оффтоп - я то понял что Sam хотел сказать - вот есть такая функция, используется наверное редко, удобно использовать например так, подпилите как хотите. Но, налетели 'специалисты' и загадили комменты :). (Ох черт, сколько Сергеев)

  9. №4693
    Сергей #3
    Сергей #3 21.05.2011, 16:07:06

    ПХП для самых маленьких))

  10. №4705
    Leonid
    Leonid 23.05.2011, 2:45:46

    А еще есть http_build_url(), и совсем велосипедов изобретать не нужно :)

  11. №4712
    Andrey
    Andrey 23.05.2011, 14:06:38
    function getUrl($url, 
                    $params = array(), 
                    $hashParams = array())
    {
        return $url
    .(!empty($params) ? '&' . http_build_query($params) : '')
    .(!empty($hashParams) ?'#'.http_build_query($hashParams):'') ;
    }
  12. №4715
    Sam
    Sam 23.05.2011, 15:00:15

    Leonid, ;)

  13. №5597
    Londeren
    Londeren 17.11.2011, 11:03:02

    2другой Sergey: не переварит вариант - 'index.php?something_else=2222&very=much'

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.