【问题标题】:PHP - multidimensional array to query stringPHP - 查询字符串的多维数组
【发布时间】:2014-12-21 05:42:43
【问题描述】:

搜索了这么久,但没有得到任何可行的答案


A) 输入:

$array = array(
            'order_source' => array('google','facebook'), 
            'order_medium' => 'google-text'
          );


看起来像:

Array
(
    [order_source] => Array
        (
            [0] => google
            [1] => facebook
        )

    [order_medium] => google-text
)


B) 所需输出:

order_source=google&order_source=facebook&order_medium=google-text


C) 我尝试过的 (http://3v4l.org/b3OYo)

$arr = array('order_source' => array('google','facebook'), 'order_medium' => 'google-text');

function bqs($array, $qs='')
{
    foreach($array as $par => $val)
    {
        if(is_array($val))
        {
            bqs($val, $qs);       
        }
        else
        {
           $qs .= $par.'='.$val.'&';
        }
    }
    return $qs;
}

echo $qss = bqs($arr);


D) 我得到了什么:

order_medium=google-text&


注意:它也应该适用于像 http_build_query() 这样的任何一维数组。

【问题讨论】:

  • 抱歉,这完全没有意义:order_source=google&order_source=facebook 你用第二个覆盖了order_source GET 变量,所以你不会得到第一个?可行的是:order_source[]=google&order_source[]=facebook
  • 不确定你打算用它做什么,但是因为你提到了http_build_query 一个注释:order_source=google&order_source=facebook 是行不通的
  • 我会解释的。这是一个订单管理系统,用户在其中单击多个链接,它的作用类似于 Excel 工作表中的过滤器。类似的东西。
  • @JaredFarrish:是的。我知道它会覆盖,因此我已经编写了一个函数,它将整个查询字符串作为输入并给出一个多维数组作为输出。
  • 为什么? PHP 已经将order_status[]=google 语法理解为数组。另一个可能更简单的选择是对您的数组进行 JSON 编码并将其作为变量传递,然后将 json_decode() 它返回到服务器上的数组。

标签: php recursion multidimensional-array query-string


【解决方案1】:

我希望这就是您正在寻找的,它适用于单维到 n 维数组。

$walk = function( $item, $key, $parent_key = '' ) use ( &$output, &$walk ) {

    is_array( $item ) 
        ? array_walk( $item, $walk, $key ) 
        : $output[] = http_build_query( array( $parent_key ?: $key => $item ) );

};

array_walk( $array, $walk );

echo implode( '&', $output );  // order_source=google&order_source=facebook&order_medium=google-text 

【讨论】:

    【解决方案2】:

    你真的不需要在这里做任何特别的事情。

    $array = array(
        'order_source' => array('google', 'facebook'),
        'order_medium' => 'google-text'
    );
    $qss = http_build_query($array);
    

    另一边:

    var_dump($_GET);
    

    结果:

    array(2) {
      ["order_source"]=>
      array(2) {
        [0]=>
        string(6) "google"
        [1]=>
        string(8) "facebook"
      }
      ["order_medium"]=>
      string(11) "google-text"
    }
    

    这确实是将数组作为 GET 变量发送的最佳方式。

    如果你绝对必须有你定义的输出,这会做到:

    function bqs($array, $qs = false) {
        $parts = array();
        if ($qs) {
            $parts[] = $qs;
        }
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                foreach ($value as $value2) {
                    $parts[] = http_build_query(array($key => $value2));
                }
            } else {
                $parts[] = http_build_query(array($key => $value));
            }
        }
        return join('&', $parts);
    }
    

    【讨论】:

    • 如果你想通过 post 发送 http_build_query 结果,那么在这样做之前 urldecode() 输出;对于 GET 请求,一切都很好
    【解决方案3】:

    尽管您在 cmets 中发现,如果您尝试将其作为 $_GET 传递,则会遇到覆盖问题,但使用递归函数获得所需结果的解决方案是:

    function bqs($array, $qs='',$index = false)
    {
        foreach($array as $par => $val)
        {
            if($index)
                $par = $index;
    
            if(is_array($val))
            {
                $qs = bqs($val, $qs,$par);       
            }
            else
            {
               $qs .= $par.'='.$val.'&';
            }
        }
        return $qs;
    }
    

    如果它是一个数组,我将连接$qs 字符串,如果它是一个array(),则将索引作为引用与值一起传递

    固定 提供 $index 后,您不需要再次连接。见这里:http://3v4l.org/QHF5G

    【讨论】:

    • 当它是一个数组时检查修复而不连接
    • 简单地做 key=value 是不安全的,任何一部分都可能需要编码。这就是 http_build_query 的用途
    猜你喜欢
    • 1970-01-01
    • 2017-07-08
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2014-10-11
    • 2011-02-07
    • 2015-04-30
    相关资源
    最近更新 更多