如何对多维数组进行urlencode?

7

我已经寻找了许久,但仍未找到可行的解决方法。我有一个动态的多维数组,需要将其拆分并进行urlencode处理。其中项数会发生变化,但键名始终相同。

$formFields = Array ( 
[0] => Array ( [form_name] => productID [form_value] => 13 ) 
[1] => Array ( [form_name] => campaign [form_value] => email@gmail.com ) 
[2] => Array ( [form_name] => redirect [form_value] => http://example.com ) ) 

每个数组都有一个表单名称和表单值。
以下是我试图达到的内容:
$desired_results = 
productID => 13
campaign => email@gmail.com
redirect => http://example.com

每次我试图将它们分开,最终得到的结果是:form_name => productID 或者类似这样的东西。我正在尝试获取这些结果并对它们进行urlencode处理。
productID=13&campaign=email&gmail.com&redirect=http://example.com&

为什么不直接使用 $fromFields = array( 'productID' => 13, ...) 呢? - Karoly Horvath
脚本不会知道键是什么。它们将根据调用它的页面而变化。这是存储在WordPress中的元数据,取决于调用脚本的帖子... $keys会改变。 - krazymatty
也许有人对更好地存储动态数组以便于调用它有建议。 - krazymatty
http://php.net/manual/en/control-structures.foreach.php - Karoly Horvath
截至版本4.4.3,有一个名为urlencode_deep的方法。你能试一下看它是否可用吗? - Ankur
4个回答

23

你可以使用serialize和unserialize:

$str = urlencode(serialize($formFields));

然后解码它:

$formFields = unserialize(urldecode($str));

4
如果只是一个数组,建议使用json_encode() / json_decode() 而不是serialize(),因为它具有更简单的结构并且生成的字符串更短。同时,它也更加通用(比如到JS等)。 - konsolenfreddy

4
无论键的名称如何,这将返回值。
$result = array();

foreach ($formFields as $key => $value)
{
  $tmp = array_values($value);
  $result[$tmp[0]] = $tmp[1];
}
print(http_build_query($result));
foreach循环遍历主数组,将子数组存储在变量$value中。函数array_values将每个数组的所有值作为新的数字数组返回。[form_name]的值将存储在第一个索引中,[form_value]的值将存储在第二个索引中。
内置的http_build_query函数将返回一个url编码的字符串。

哇,太棒了!我还不理解它,但它能用!非常感谢。 - krazymatty

0
这是我用于执行此操作的简单函数:
function array_urlencode($data) {
    if (is_array($data)) {
        foreach($data as $k => $v) $data_temp[urlencode($k)]=array_urlencode($v);
        return $data_temp;
    } else {
        return urlencode($data);
    }
}

-1
<!-- Encode entire array here -->

function encode(&$item, $key) {
$item = rawurlencode($item);
}

array_walk_recursive($input_array, 'encode');

它返回数组。 - srokatonie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接