如何对字符串数组的子字符串进行排序

问题描述 投票:0回答:3

我有一个像这样的字符串数组:

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'

正确的做法是什么?

php string sorting
3个回答
1
投票

排序函数返回一个布尔值来显示排序是否成功。在你的行中:

$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] = 橙子


0
投票

sort
返回一个布尔值(实际上无用)并就地进行排序。代码可以像

一样简单
// note iteration by reference
foreach($exploded_urls as &$url_to_sort){
    sort($url_to_sort);
}

在此循环之后,

$exploded_urls
的每个元素都将被排序。


0
投票

如果您知道自己正在处理查询字符串,请不要仅仅使用

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
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.