Php 按其子元素对数组排序
如何按“总计”对数组排序?我试过Php 按其子元素对数组排序,php,sorting,Php,Sorting,如何按“总计”对数组排序?我试过arsort($myArray[“total”])但返回null array (size=3) 0 => array (size=2) 'name' => string 'Rnukir' (length=6) 'total' => string '9m' (length=2) 1 => array (size=2) 'name' => string 'Arnesista'
arsort($myArray[“total”])
但返回null
array (size=3)
0 =>
array (size=2)
'name' => string 'Rnukir' (length=6)
'total' => string '9m' (length=2)
1 =>
array (size=2)
'name' => string 'Arnesista' (length=9)
'total' => string '1m 45s' (length=6)
2 =>
array (size=2)
'name' => string 'Omas' (length=8)
'total' => string '1m 22s' (length=6)
您需要使用其中一个变量,并提供一个定义元素顺序的回调 回调将传递两个当前比较的元素。在您的例子中,这是一个大小为2的数组(包含关键字名称和总数)。它必须返回负值、0或正值,以指示第一个参数是应该在第二个参数之前排序,还是应该在第二个参数之后排序 一种可能是
strlen($a['total'])-strlen($b['total'])
(因为我不知道你到底希望PHP如何神奇地对你的total值排序)。你正在寻找
如果要精确排序,回调函数可以如下所示:
function compare($a, $b)
{
// Get minutes and second from 'total' string
$regular_expression = "/^(([0-9]{1,2})m )?([0-9]{1,2})s$/";
if(preg_match($regular_expression, $a['total'], $matchA) != 1) return 0; // Invalid time string
if(preg_match($regular_expression, $b['total'], $matchB) != 1) return 0; // Error handling
// Calculate total amount of seconds
$secondsA = 0;
if(strlen($matchA[2]) > 0) $secondsA = 60 * (int)$matchA[2]; // Minutes
if(strlen($matchA[2]) > 0) $secondsB = 60 * (int)$matchB[2];
$secondsA += (int)$matchA[3]; // Seconds
$secondsB += (int)$matchB[3];
// Compare
// Equal -> 0
if ($secondsA == $secondsB) {
return 0;
}
// A smaller than B -> -1
// A higher than B -> 1
return ($secondsA < $secondsB) ? -1 : 1;
}
函数比较($a,$b)
{
//从“总计”字符串中获取分钟和秒数
$regular_expression=“/^([0-9]{1,2})m)?([0-9]{1,2})s$/”;
if(preg_match($regular_expression,$a['total'],$match)!=1)返回0;//时间字符串无效
if(preg_match($regular_expression,$b['total',$matchB)!=1)返回0;//错误处理
//计算总秒数
$secondsA=0;
如果(strlen($matchA[2])>0)$secondsA=60*(int)$matchA[2];//分钟
如果(strlen($matchA[2])>0)$secondsB=60*(int)$matchB[2];
$secondsA+=(int)$matchA[3];//秒
$secondsB+=(int)$matchB[3];
//比较
//相等->0
如果($secondsA==$secondsB){
返回0;
}
//A小于B->-1
//A高于B->1
回报率($secondsA<$secondsB)?-1:1;
}
PHP知道如何使用“compare”函数,并使用数组项自动调用它。您不需要自己调用比较函数。
(代码未经测试)
试试这样的方法
<?php
$array = array(
0 =>array(
'name' => 'Rnukir',
'total' => '1'),
1 => array(
'name' => 'Arnesista',
'total' => '2'),
2 => array(
'name' => 'Omas',
'total' => '3'),
3 => array(
'name' => 'John',
'total' => '4')
);
foreach ($array as $key => $row) {
$name[$key] = $row['name'];
$total[$key] = $row['total'];
}
print_r($total);
array_multisort($total, SORT_DESC, $array);
// array_multisort($total, SORT_DESC, $name, SORT_ASC $array);
echo "<pre>";
print_r($array);
echo "</pre>";
?>
Adn什么是$a和$b?回调的两个参数(参见我的第二段)。usort docs页面对其进行了更深入的解释。注意:未定义的偏移量:11在文件的$b=$activityTimes[$key+1]行
在//如果偶数或0
块中,您在哪里以及如何使用$b=$activityTimes[$key+1];这个答案适用于任何以分/秒为单位的数组值,只需执行这个答案。您可以解释一下它是如何工作的以及在哪里得到了$total
?usort
返回bool true
,但什么也没有发生。
<?php
$array = array(
0 =>array(
'name' => 'Rnukir',
'total' => '9m'),
1 => array(
'name' => 'Arnesista',
'total' => '1m 45s'),
2 => array(
'name' => 'Omas',
'total' => '1m 42s'),
3 => array(
'name' => 'John',
'total' => '11m')
);
//1 - String value convert to time in second
$modified_array = array();
foreach($array as $key=>$each) {
$each["total"] = stringToTime($each["total"]);
$modified_array[$key] = $each;
}
//2 - Sort array based on second
usort($modified_array, "cmp");
//3 - Convert second to string
$final_array = array();
foreach($modified_array as $key=>$each) {
$each["total"] = timeToString($each["total"]);
$final_array[$key] = $each;
}
//4 - See output
print_r($final_array);
function stringToTime($str)
{
$str_array = explode(" ",$str);
$v = 0;
foreach($str_array as $key=>$value) {
$v += substr($value,-1)=='m' ? substr($value,0,-1)*60 : substr($value,0,-1)*1;
}
return $v;
}
function timeToString($time)
{
$m = intval($time/60);
$s = $time%60;
if(empty($s))
return $m."m";
else
return $m."m ".$s."s";
}
function cmp($a, $b)
{
if ($a['total'] == $b['total']) {
return 0;
}
return ($a['total'] > $b['total']) ? -1 : 1;
}
?>
<?php
$array = array(
0 =>array(
'name' => 'Rnukir',
'total' => '1'),
1 => array(
'name' => 'Arnesista',
'total' => '2'),
2 => array(
'name' => 'Omas',
'total' => '3'),
3 => array(
'name' => 'John',
'total' => '4')
);
foreach ($array as $key => $row) {
$name[$key] = $row['name'];
$total[$key] = $row['total'];
}
print_r($total);
array_multisort($total, SORT_DESC, $array);
// array_multisort($total, SORT_DESC, $name, SORT_ASC $array);
echo "<pre>";
print_r($array);
echo "</pre>";
?>