PHP - 用于查询字符串的多维数组

时间:2014-10-25 15:20:22

标签: php recursion multidimensional-array query-string

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


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 =谷歌的文本


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 =谷歌文本&安培;


注意:它也适用于 http_build_query() 等任何单维数组。

3 个答案:

答案 0 :(得分:8)

我希望这是你正在寻找的,它适用于单维到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 

答案 1 :(得分:1)

虽然您在评论中发现如果您尝试将其作为$_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

答案 2 :(得分:1)

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

$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);
}