手动编写包含嵌套数组数据的url查询字符串

发布于 2024-10-11 06:16:15 字数 167 浏览 10 评论 0原文

我希望手动编写一个多维 $_GET 查询字符串,前几天看到了这一点,但不太记得了!

像这样的东西:

www.url.com?val1=abc&val2=cde&[val3=fgh&val4=ijk]

I'm looking to manually write a multidimensional $_GET query string, saw this done the other day, but can't quite remember it!

something like:

www.url.com?val1=abc&val2=cde&[val3=fgh&val4=ijk]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

红ご颜醉 2024-10-18 06:16:15
http://domain.tld/path/to/script.php?arr[a][b][c]=foo

var_dump($_GET);
http://domain.tld/path/to/script.php?arr[a][b][c]=foo

and

var_dump($_GET);
oО清风挽发oО 2024-10-18 06:16:15

由于 URL 中的数组参数是用括号后缀的,所以我会尝试这样的函数:

    <?php
function array_map_scope( $callback, array $array, array $arguments = array(), $scope = array() ) {
    if( !is_callable( $callback ) ) {
        return( false );
    }
    $output = array();

    foreach( $array as $key => $value ) {
        if( is_array( $value ) ) {
            $output[$key] = array_map_scope( $callback, $value, $arguments, array_push_value( $scope, $key ) );
        } else {
            $output[$key] = call_user_func_array( $callback, array_merge( array( $value, array_push_value( $scope, $key ) ), $arguments ) );
        }
    }
    return( $output );
}

function array_push_value( $array, $value ) {
    $array[] = $value;
    return( $array );
}

function urlParam( $value, $key, $name ) {
    return( $name.'['.implode( array_map( 'urlencode', $key ), '][' ).']='.urlencode( $value ) );
}

function array_values_recursive( $array ) {
    $output = array();    
    foreach( $array as $value ) {
        if( is_array( $value ) ) {
            $output = array_merge( $output, array_values_recursive( $value ) );
        } else {
            $output[] = $value;
        }
    }
    return( $output );
}

function array2URL( $name, $array ) {
    $array = array_map_scope( 'urlParam', $array, array( urlencode( $name ) ) );
    return( implode( array_values_recursive( $array ), '&' ) );
}

echo array2URL('test', array( 'a'=>'a','b'=>array('ba'=>'ba','bb'=>'bb'),'c'=>'c' ) );
?>

Since array parameters in URL's are postfixed by brackets, I'd try a function like this:

    <?php
function array_map_scope( $callback, array $array, array $arguments = array(), $scope = array() ) {
    if( !is_callable( $callback ) ) {
        return( false );
    }
    $output = array();

    foreach( $array as $key => $value ) {
        if( is_array( $value ) ) {
            $output[$key] = array_map_scope( $callback, $value, $arguments, array_push_value( $scope, $key ) );
        } else {
            $output[$key] = call_user_func_array( $callback, array_merge( array( $value, array_push_value( $scope, $key ) ), $arguments ) );
        }
    }
    return( $output );
}

function array_push_value( $array, $value ) {
    $array[] = $value;
    return( $array );
}

function urlParam( $value, $key, $name ) {
    return( $name.'['.implode( array_map( 'urlencode', $key ), '][' ).']='.urlencode( $value ) );
}

function array_values_recursive( $array ) {
    $output = array();    
    foreach( $array as $value ) {
        if( is_array( $value ) ) {
            $output = array_merge( $output, array_values_recursive( $value ) );
        } else {
            $output[] = $value;
        }
    }
    return( $output );
}

function array2URL( $name, $array ) {
    $array = array_map_scope( 'urlParam', $array, array( urlencode( $name ) ) );
    return( implode( array_values_recursive( $array ), '&' ) );
}

echo array2URL('test', array( 'a'=>'a','b'=>array('ba'=>'ba','bb'=>'bb'),'c'=>'c' ) );
?>
墨落成白 2024-10-18 06:16:15

依靠 http_build_query() 为您完美格式化查询字符串。

可以直接在脚本中使用它来生成 url 中 ? 之后的子字符串,也可以使用沙箱设置数组数据,调用该函数,然后将输出复制粘贴到静态文件中。

代码:(演示)

$array = [
    'indexed value',
    'foo' => 'first level value',
    'bar' => ['baz' => 'second level']
];

echo http_build_query($array);
// 0=indexed+value&foo=first+level+value&bar%5Bbaz%5D=second+level

边缘案例考虑

Rely on http_build_query() to perfectly format a query string for you.

Either use it directly in your script to generate the substring after ? in the url or use a sandbox to set up your array data, call the function, then copy-paste the output in your static file.

Code: (Demo)

$array = [
    'indexed value',
    'foo' => 'first level value',
    'bar' => ['baz' => 'second level']
];

echo http_build_query($array);
// 0=indexed+value&foo=first+level+value&bar%5Bbaz%5D=second+level

A fringe case consideration

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文