2014-01-25 35 views
3

我有两个php数组。并具有用于每个这些阵列的不同的排序问题:如何在字符串中的某个字符后按字母顺序排序一个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)I也有一个包含 “双” 域值第二阵列:

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

如果你的每个值都是一个数组,分割在''。您可以根据数组中的元素进行排序。例如'values [0] = array('absd','com');'。 – mc10

+2

http://php.net/usort –

回答

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>"; 
} 

这是一个很好的例证你将如何从整体数据考虑你将如何受益,而不是关注未连接的子任务(如在这种情况下进行排序)。

+0

啊,它的工作,并没有在编辑器中的错误!你知道什么是最好的方法,当我打印出来,例如与echo(“
”);每组之后? – Acidon

+0

看到我的编辑.... –

+0

谢谢黑色,它完美无瑕地工作,你是男人! – Acidon

6

usort是答案。

试试这个:

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

(请注意,您将需要的explode结果存储在一个临时变量,并访问分开,如果你还在使用PHP 5.3或以上)

+0

由于某种原因字符串爆炸给我在编辑器中的语法错误,但它适用于有问题的拳头阵列,但不适用于第二个 – Acidon

+0

我认为爆炸极限应该设置为1,以便从第二个数组中排序完整的.xx.yy后缀。 –

+0

@kuroineko所以你想要将一个字符串分解成一个部分?这是有道理的:p –

相关问题