我有一个像这样的字符串数组:
array
0 => string 'cheese=french'
1 => string 'pizza=large&cheese=french'
2 => string 'cheese=french&pizza=small'
3 => string 'cheese=italian'
我需要按字母顺序对数组中字符串中的每个子字符串(除以&)进行排序。例如: Pizza=large&cheese=french 应该是相反的:cheese=french&pizza=large,因为 'c' 在 'p' 之前。
我想我可以像这样分解原始数组:
foreach ($urls as $url)
{
$exploded_urls[] = explode('&',$url);
}
array
0 => array
0 => string 'cheese=french'
1 => array
0 => string 'pizza=large'
1 => string 'cheese=french'
2 => array
0 => string 'cheese=french'
1 => string 'pizza=small'
3 => array
0 => string 'cheese=italian'
然后在 foreach 循环中使用排序,例如:
foreach($exploded_urls as $url_to_sort)
{
$sorted_urls[] = sort($url_to_sort);
}
但是当我这样做时,它只是返回:
array
0 => boolean true
1 => boolean true
2 => boolean true
3 => boolean true
4 => boolean true
至:
14 => boolean true
当我这样做时:
foreach($exploded_urls as $url_to_sort)
{
sort($url_to_sort);
}
我取回其中一个数组,已排序:
array
0 => string 'cheese=dutch'
1 => string 'pizza=small'
正确的做法是什么?
排序函数返回一个布尔值来显示排序是否成功。在你的行中:
$sorted_urls[] = sort($url_to_sort);
您正在将 sort 的返回值(true 或 false)分配给 $sorted_urls 数组。您不需要这样做 - sort 将修改您调用它的数组,因此不必尝试将结果分配到新数组中,只需调用 sort,然后查看排序数组的 $url_to_sort 即可。
来自
sort
的文档:
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
foreach ($fruits as $key => $val) {
echo "fruits[" . $key . "] = " . $val . "\n";
}
上面的例子将输出:
水果[0] = 苹果
水果[1] = 香蕉
水果[2] = 柠檬
水果[3] = 橙子
sort
返回一个布尔值(实际上无用)并就地进行排序。代码可以像一样简单
// note iteration by reference
foreach($exploded_urls as &$url_to_sort){
sort($url_to_sort);
}
在此循环之后,
$exploded_urls
的每个元素都将被排序。
如果您知道自己正在处理查询字符串,请不要仅仅使用
explode()
;使用专为该任务设计的解析工具 - parse_str()
。
解析字符串后,按键对关联数组进行排序,然后使用
http_build_query()
将数据返回到其原始形式。
代码:(演示)
$queryStrings = [
'cheese=french',
'pizza=large&cheese=french',
'cheese=french&pizza=small',
'cheese=italian',
];
var_export(
array_map(
function($qs) {
parse_str($qs, $result);
ksort($result);
return http_build_query($result);
},
$queryStrings
)
);