2012-04-19 90 views
0

我意识到还有其他几个与此有关的问题 - 但它们对我来说都没有意义,或者根本无法工作。按特定值排序多维数组(使用asort和rasort)

我有一个数组,通过使用asort()arsort(),可以按字母顺序排列第一个值。我多维数组的一个例子可能是:

[{"Name":"Amber","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Bob","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Hans","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Jeff","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Michael","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0}] 

随着使用asort()arsort()它是由"Name"字母顺序排序或反向字母。现在我需要相同的功能,仅基于"dealType"

我已经尝试了几个已经发布在Stackoverflow上的例子,但我必须误解他们,因为他们不工作。我该如何做到这一点?

编辑 乔纳森给出的字母排序正确的答案,有轻微的修改:

//the custom function to do our sort 
function cmp($a,$b){ 
    //get which string is less or 0 if both are the same 
    $cmp = strcasecmp($a->dealType, $b->dealType); 
    //if the strings are the same, check name 
    return $cmp; 
} 
//sort using a custom function 
usort($obj, 'cmp'); 

和下面这段代码反向字母排序:

//the custom function to do our sort 
function cmp($a,$b){ 
    //get which string is less or 0 if both are the same 
    $cmp = strcasecmp($b->dealType, $a->dealType); 
    //if the strings are the same, check name 
    return $cmp; 
} 
//sort using a custom function 
usort($obj, 'cmp'); 

回答

2

您应该使用usort这将允许您使用自定义功能进行比较,以确定排序时价值是第一位的。

类似:

<?php 
//the data you supplied. normally just an array 
$data = array (0 => array ('Name' => 'Amber', 'date' => '', 'dealType' => 'deal1', 'id' => '***@***.com', 'registered' => 0,), 1 => array ('Name' => 'Bob', 'date' => '', 'dealType' => 'deal5', 'id' => '***@***.com', 'registered' => 0,), 2 => array ('Name' => 'Hans', 'date' => '', 'dealType' => 'deal3', 'id' => '***@***.com', 'registered' => 0,), 3 => array ('Name' => 'Jeff', 'date' => '', 'dealType' => 'deal2', 'id' => '***@***.com', 'registered' => 0,), 4 => array ('Name' => 'Michael', 'date' => '', 'dealType' => 'deal1', 'id' => '***@***.com', 'registered' => 0,),); 

//show what we got going into sort 
echo '<pre>'.print_r($data, 1).'</pre>'; 

function cmp($a,$b){ 
    //get which string is less or 0 if both are the same 
    $cmp = strcasecmp($a['dealType'], $b['dealType']); 
    //if the strings are the same, check name 
    if($cmp == 0){ 
     //compare the name 
     $cmp = strcasecmp($a['Name'], $b['Name']); 
    } 
    return $cmp; 
} 
//sort using a custom function 
usort($data, 'cmp'); 

//show what we got after sort 
echo '<pre>'.print_r($data, 1).'</pre>'; 
?> 

将在dealType第一,然后Name秒排序如果dealType是一样的。如果您想要反向排序,则可以在调用strcasecmp()时调换$a$b的顺序。

编辑:这个数据可能是从数据库中提取的。如果是这样,那么只需ORDER BY的列。你可以这样做:SELECT * FROM table ORDER BY dealType ASC,Name ASC

Edit2:更新了代码,不使用匿名函数。你也可以查看代码在ideone

+0

它是通过.NET WCF给我的,否则我会做你编辑说的。你上面的代码给出了某种错误。 – mdance 2012-04-19 21:14:11

+0

旧版本的php( 2012-04-19 21:20:02

+0

我有版本5.3.3 – mdance 2012-04-19 21:22:35

0

我相信你正在寻找对于array_multisort()http://php.net/manual/en/function.array-multisort.php

例如:

<?php 
$ar = array(
     array("10", 11, 100, 100, "a"), 
     array( 1, 2, "2", 3, 1) 
    ); 
array_multisort($ar[0], SORT_ASC, SORT_STRING, 
       $ar[1], SORT_NUMERIC, SORT_DESC); 
var_dump($ar); 
?> 

来源:http://php.net/manual/en/function.array-multisort.php#example-4558

+0

'在array_multisort()'一直是一个谜我出于某种原因...这将是巨大的如果你能解释如何使用它并使你的答案适应这个问题。 – rid 2012-04-19 20:39:23

+0

'array_multisort()'不工作...不排序任何东西。至少我如何设置:'array_multisort($ objVZA [1],SORT_DESC,SORT_STRING);' – mdance 2012-04-19 20:42:05

+0

@mdance,'array_multisort()* * *工作,只要你可以得到正确的咒语... – rid 2012-04-19 20:44:19

1

工作如果我正确理解你的问题,你有阵列(说)阵列(比如BS),并且希望通过他们一定的参考价值烧烤排序。如果这是正确的,我以前有同样的问题,并制定了自定义函数称为line_sort。 如果你愿意,你可以通过例如使用它:

$array=json_decode('[{"Name":"Amber","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Bob","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Hans","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Jeff","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Michael","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0}]'); 
$array=line_sort("dealType",$array); 

第一个值是要排序键,第二个是数组进行,这里整理的功能代码(对不起它不是英文) :

function line_sort($klic,$hodnoty) 
{ 
    if (!is_array($hodnoty)) 
    { 
    trigger_error("Second parameter has to be multidimensional array", E_USER_WARNING); 
    return; 
    } 
    for ($x=0;$x<count($hodnoty)-1;$x++) 
    { 
    for ($y=count($hodnoty)-1;$y>=$x;$y--) 
    { 
     $radek1=$hodnoty[$y]; 
     $radek2=$hodnoty[$y+1]; 
     if ((isset($radek1[$klic]) && isset($radek2[$klic])) && (intval($radek1[$klic]) > intval($radek2[$klic])) || (isset($radek2[$klic]) && !isset($radek1[$klic]))) 
     { 
     $hodnoty[$y]=$radek2; 
     $hodnoty[$y+1]=$radek1; 
     continue; 
     } 
     else if((isset($radek1[$klic]) && isset($radek2[$klic])) && (intval($radek1[$klic]) == intval($radek2[$klic]))) 
     { 
     if (strcmp($radek1[$klic],$radek2[$klic])>0) 
     { 
      $hodnoty[$y]=$radek2; 
      $hodnoty[$y+1]=$radek1; 
     } 
     } 
    } 
    } 
    return $hodnoty; 
} 

如果你想看到的输出示例的此功能,看看这个:http://test.hanzlsoft.eu/