我有两个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()
方法仅根据第一个字母进行排序......
答案 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>";
}
这是一个很好的例子,说明如何从整体数据的角度思考,而不是关注未连接的子任务(如在这种情况下进行排序)。