需要用php对第二个嵌套数组按第n个值进行排序;'开始时间'。思考也许超调是关键。发布嵌套的@week @day @class数组以及usort调用和我一直在尝试的变体函数。
Array
(
[Sunday] => Array
(
[0] => Array
(
[Class Name] => Fun Class
[Instructor] => Fun Teacher
[Class Type] => Yoga Stretches
[Start Time] => 1899-12-30T17:00:00
[End Time] => 1899-12-30T18:15:00
[Day Name] => Sunday
)
[1] => Array
(
[Class Name] => Another Fun Class
[Instructor] => Same Fun Teacher
[Class Type] => Relaxation
[Start Time] => 1899-12-30T18:30:00
[End Time] => 1899-12-30T19:45:00
[Day Name] => Sunday
)
[2] => Array
(
[Class Name] => Hot Yoga without Cold
[Instructor] => Dave the Flexible
[Class Type] => Hot Hot Yoga
[Start Time] => 1899-12-30T09:00:00
[End Time] => 1899-12-30T10:30:00
[Day Name] => Sunday
)
)
[Monday] => Array
(
[0] => Array
(
[Class Name] => Mellow Chill Hang
[Instructor] => Guru Awesome
[Class Type] => Yoga Namaste
[Start Time] => 1899-12-30T12:00:00
[End Time] => 1899-12-30T13:00:00
[Day Name] => Monday
)
)
)
尝试过(变化形式):
foreach ($week_schedule as $day)//$week_schedule = the outer array
{
for($j=count($week_schedule);$j>=0;$j--)
usort($day,'sortTimes');
}
function sortTimes( $a, $b ) {
return strtotime($a["Start Time"]) - strtotime($b["Start Time"]);
}
尝试使用单个foreach提取值($ day => $ class)。我敢打赌这不会最终需要很多代码。
尝试使用array_map进入嵌套元素,您Start Time
拥有一个'T'字符,我认为该字符无法使用,strtotime
因此我将其删除:
function custom_map( $array ) {
usort( $array, function( $a, $b ) {
return ($a['Start Time']<$b['Start Time'])? -1 : 1;
});
return $array;
}
$new_array = array_map( "custom_map", $week_schedule );
var_dump($new_array);
由于您有兴趣了解其工作原理,因此我自己做了一些研究,并提出了以下解释:
首先,您应该知道array_map()和usort()的用途。
来自PHP Doc的array_map():
将回调函数应用于每个数组后,array_map()将返回一个包含array1的所有元素的数组。
句法:
array array_map ( callable $callback , array $array1 [, array $... ] )
简单来说,array_map()会将数组的每个元素传递给您指定的回调函数。它返回一个数组(用更改后的值,您在做了该回调函数)。
现在usort(),
来自PHP Doc的usort():
该函数将使用用户提供的比较函数按其值对数组进行排序。如果您希望排序的数组需要按照一些非平凡的条件进行排序,则应使用此函数。
句法:
bool usort ( array &$array , callable $value_compare_func )
因此,usort()基本上比较每个数组元素,以便以正确的顺序对其进行排序。您在此处看到的行:
return ($a['Start Time']<$b['Start Time'])? -1 : 1;
基本上翻译为:
if $a['Start Time'] is lesser than $b['Start Time'], then return -1 so
that $a can come before $b
带有值:
$a['Start Time'] = '1899-12-30T09:00:00'; //3rd element
$b['Start Time'] = '1899-12-30T17:00:00'; //1st element
现在很明显,作为第三个元素的$ a小于第一个元素$ b,因此$ a会位于第一个元素之前。usort()从头到尾检查每个组合以进行排序。
现在,回到array_map(),我们使用它的原因是因为您有嵌套的数组。
array_map()的实际作用是将所有@days传递给usort。然后usort接受所有@class并进行相应的排序。如果您看到下面的演示,其中您的@weeks仅被删除了@days和@class出现,则上面的代码将不起作用,并且会因为找不到您要遍历2的错误而引发“找不到开始时间”的错误仅存在1个时的嵌套数组:
对于上述结构,正确的方法将是直接实现usort,而无需使用array_map,例如:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句