我意识到还有几个与此相关的问题--但要么它们对我来说毫无意义,要么就不符合我的需要。
我有一个数组,可以通过使用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');发布于 2012-04-19 20:35:55
您应该使用乌斯托,这将允许您使用自定义的比较函数来确定排序时哪个值放在第一位。
类似于:
<?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是相同的话。如果要进行反向排序,则可以在$a调用中交换strcasecmp()和$b的顺序。
编辑:这些数据很可能是从数据库中提取出来的。如果是这样的话,那么只需ORDER BY列。你可以像SELECT * FROM table ORDER BY dealType ASC,Name ASC那样做
Edit2:更新代码以避免使用匿名函数。此外,还可以查看在意为中工作的代码。
发布于 2012-04-19 20:52:48
如果我正确地理解了您的问题,您就有数组(例如A)数组(例如B),并且您希望根据它们中的某些值对B进行排序。如果是这样的话,我以前也遇到过同样的问题,并创建了名为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/
发布于 2012-04-19 20:34:37
我相信你在找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
https://stackoverflow.com/questions/10236272
复制相似问题