如何在字符串中的某个字符后按字母顺序对php数组进行排序

时间:2014-01-25 04:00:47

标签: php arrays sorting

我有两个php数组。对每个阵列都有不同的排序问题:

1)首先包含域列表:

values[0] = "absd.com";
values[1] = "bfhgj.org";
values[2] = "sdfgh.net";
values[3] = "sdff.com";
values[4] = "jkuyh.ca";

我需要按DOMAIN值按字母顺序排序这个数组,换句话说,按'。'后面的值排序,所以排序后的域名如下:

values[0] = "jkuyh.ca";
values[1] = "absd.com";
values[2] = "sdff.com";
values[3] = "sdfgh.net";
values[4] = "bfhgj.org";

2)我还有第二个包含“双”域值的数组:

values[0] = "lkjhg.org.au";
values[1] = "bfhgj.co.uk";
values[2] = "sdfgh.org.uk";

我需要按DOUBLE DOMAIN值按字母顺序对此数组进行排序,换句话说,按“。”的第一个实例后的值排序。在域中,所以排序的域将如下:

values[1] = "bfhgj.co.uk";
values[0] = "lkjhg.org.au";
values[2] = "sdfgh.org.uk";

我该如何解决这个问题? sort()方法仅根据第一个字母进行排序......

2 个答案:

答案 0 :(得分:6)

usort就是答案。

试试这个:

usort($values,function($a,$b) {
    return strcasecmp(
        explode(".",$a,2)[1],
        explode(".",$b,2)[1]
    );
});

(请注意,如果您仍在使用PHP 5.3或更早版本,则需要将explode的结果存储在临时变量中并单独访问它。

答案 1 :(得分:2)

另一种变体:

usort ($values,
    function ($a,$b) {
       return strcmp (strstr ($a, '.'), strstr ($b, '.'));
    });

这将适用于您的数组,因为比较使用从第一个'开始的字符串部分。'

如果你想按组打印出来,我认为一个好的解决方案是首先创建一个合适的数据结构,然后将其用于排序和打印:

$values = array ("zercggj.co.uk", "lkjhg.org.au", "qqxze.org.au",
                 "bfhgj.co.uk", "sdfgh.org.uk");

echo "<br>input:<br>";
foreach ($values as $host) echo "$host<br>";

// create a suitable structure
foreach ($values as $host)
{
    $split = explode('.', $host, 2);
    $printable[$split[1]][] = $split[0];
}

// sort by domains
asort ($printable);

// output
echo "<br>sorted:<br>";
foreach ($printable as $domain => $hosts)
{
    echo "domain: $domain<br>";

    // sort hosts within the current domain
    asort ($hosts);

    // display them
    foreach ($hosts as $host)
        echo "--- $host<br>";
}

这是一个很好的例子,说明如何从整体数据的角度思考,而不是关注未连接的子任务(如在这种情况下进行排序)。