2014-03-05 33 views
0

需要用值n排序第二个嵌套数组第三个用php; '开始时间'。关键在于思考也许是最重要的。发布@week @day @class的嵌套数组以及一个usort调用和函数我一直在尝试变体。按照值排序第二个嵌套数组在第三个使用php

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($天=> $类)尝试。 我敢打赌,这不会最终需要太多的代码。

回答

1

尝试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); 

Demo

说明:

由于您有兴趣了解此工作原理,我自己做了一些研究,并提出了这样的解释:

首先,你应该知道array_map()和usort()的用途。

array_map()从PHP文档:

array_map()返回一个包含ARRAY1 的所有元素应用回调函数每一个之后的阵列。

语法:

array array_map (callable $callback , array $array1 [, array $... ]) 

简单地说,array_map()将通过您的阵列到您指定的回调函数的每个元素。并且它返回一个数组(带有已更改的值,您已在中完成回调函数)。

现在usort(),

usort()从PHP文档:

该函数将排序通过使用用户提供的比较函数其值的数组。如果你想排序的数组需要按照一些非平凡的标准进行排序,你应该使用这个函数。

语法:

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 

现在显然,美元的这是第三个因素是比第一更小元素$ b,因此$ a将位于它之前。 usort()检查每个组合从开始到结束,以便进行排序。

现在,回到array_map(),我们使用它的原因是因为你有嵌套数组。

array_map()实际上做的是将所有@days传递给usort。然后,usort会将您的所有@class并相应地排序。如果你看到下面的演示,你的@weeks只被@days和@class存在,上面的代码将不起作用,并且会导致你错误的'Start Time'找不到,因为你试图遍历2嵌套的数组当只有1存在:

Demo

对于上述结构中,正确的方法将是直接实现usort而不使用array_map像:

Demo

+0

谢谢@我可以有Cheezburger。当然有用。在我的服务器上(php 5.5.3)在日期时间('开始时间')字段中使用'T'。 usort函数如何知道三个数组中的哪一个(@week,@day,@classes)查找'Start Time'?它是否会进一步深入地搜索嵌套数组,直到找到与“开始时间”匹配的内容为止 – MikeiLL

+0

我还喜欢清楚说明usort正在做什么。说出数组中是否有四个元素;它是否将第一个元素与其他元素进行比较,如果测试结果为真,则将其减少数字键?那会自动增加以前在阵列中那个位置的密钥吗? – MikeiLL

+0

@MikeiLL我已经添加了对上述答案的解释,希望它能清除一些疑问。 –

相关问题