2017-10-12 62 views
0

我正在学习PHP中的数组。我正在研究多维数组,其中我正面临一个问题。我想打印场地和日期的输出基地。试图沿多维数组搜索并打印出所需的输出

下面是示例多维数组的说明:

Array 
(
    [0] => Array 
     (
      [venue] => chicago 
      [course] => science 
      [time] => 2pm 
      [date]=>jan2016-feb-2017 

     ) 

    [1] => Array 
     (
      [venue] => newyork 
      [course] => robotics 
      [time] =>3pm 
      [date]=>jan2016-feb-2017 
     ) 

    [2] => Array 
     (
      [venue] => newyork 
      [course] => science 
      [time] => 4pm 
       [date]=>mar2017-feb-2018 
     ) 
    [3] => Array 
     (
      [venue] => chicago 
      [course] => robtics 
      [time] => 4pm 
      [date]=>mar2017-feb-2018 
     ) 
[4] => Array 
     (
      [venue] => chicago 
      [course] => robotics 
      [time] => 2pm 
      [date]=>jan2016-feb-2017 

     ) 
    [5] => Array 
     (
      [venue] => chicago 
      [course] => science 
      [time] => 4pm 
      [date]=>mar2017-feb-2018 

     ) 
[6] => Array 
     (
      [venue] => newyork 
      [course] => robotics 
      [time] =>1pm 
      [date]=>mar2017-feb-2018 
     ) 

    [7] => Array 
     (
      [venue] => newyork 
      [course] => science 
      [time] => 5pm 
       [date]=>mar2017-feb-2018 
     ) 

) 

这里是所期望的输出,我想:

chicago 
Date:jan2016-feb-2017 
science 2pm 
robotics 2pm 

chicago 
Date:mar2017-feb-2018 
science 4pm 
robotics 4pm 


newyork 
Date:jan2016-feb-2017 
science 4pm 
robotics 3pm 

newyork 
Date:mar2017-feb-2018 
science 5pm 
robotics 1pm 

我想打印的地点和日期also.please输出基底帮我个人

我的当前代码:

usort($events, function($a, $b) { 
    return strcmp($a['venue'], $b['venue']); 
}); 
$previousVenue = null; 
foreach ($events as $event) { 

    // check if this venue is the same as the previous, output header if not 
    if ($event['venue'] != $previousVenue) { 
     echo "<h3>$event[venue]</h3>"; 
     echo "$event[date]"; 
    } 
    // always output course and time 
    echo "$event[course] $event[time]<br>"; 

    // current venue becomes previous venue 
    $previousVenue = $event['venue']; 
} 

我设法在场地进行搜索,但我无法根据日期进行打印。

+0

你目前的代码是什么? –

回答

0

您可以使用usortuasort对基于一个或多个键的多维数组进行排序。例如。你可以根据场地和日期分别对它进行排序,然后迭代结果并打印出来。

uasort($events, function($a, $b) { 
    $venueComparison = strcmp($a['venue'], $b['venue']); 
    if (!$venueComparison) { 
     return compare_date($a['date'], $b['date']); 
    } 
}); 

foreach ($events as $event) { 
    echo '...'; 
} 

或者你可以迭代你的多维数组并将其转换为更合适的结构。

$groupedEvents = array(); 
foreach ($events as $event) { 
    if (!array_key_exists($event['venue'], $groupedEvents)) { 
     $groupedEvents[$event['venue']] = array(); 
    } 
    $groupedEvents[$event['venue']][] = $event; 
} 

foreach ($groupedEvents as $venue => $events) { 
    usort($events, 'compare_date'); 
    foreach ($events as $event) { 
     echo '...'; 
    } 
} 

无论采用哪种方式,都需要解析日期范围并对其进行排序。你们都需要自己做解析,然后决定是否按开始日期或结束日期排序。

或者,如果可能的话,您可以切换到更容易排序的日期范围格式。例如。 ISO 8601.

一个镜头是在日期的第一部分拆分strotime(),并比较得到的时间戳。像这样的东西:

function compare_date($a, $b) { 
    return strtotime(substr($a, 0, strpos($a, '-'))) - strtotime(substr($b, 0, strpos($b, '-'))); 
} 
+0

我用过,但我无法根据日期打印 – vyshnavi

+0

我通过回答问题来解决如何对日期格式进行排序的问题。这对你有用吗? –

+0

它没有工作你可以分享你的输出或你能解释你回答更多 – vyshnavi

0

你需要使日期的东西,我们可以“订购”。如果你这样做,你可以再次运行usort。 (php7的方式顺便说一句)。希望这是有用的...编辑,有点乱码,但也许你得到它:)干杯

/*-----(example array)------*/ 
     $arr = array(
      array(
       'venue' => 'chicago', 
       'course' => 'science', 
       'time' => '2pm', 
       'date' => 'jan2016-feb-2017', 
      ), 
      array(
       'venue' => 'amsterdam', 
       'course' => 'science', 
       'time' => '4pm', 
       'date' => 'jan2016-feb-2017', 
      ), 
      array(
       'venue' => 'chicago', 
       'course' => 'science', 
       'time' => '2pm', 
       'date' => 'jan2016-feb-2017', 
      ), 
     ); 

     /*-----(remove dublicates)-----*/ 
     $s = array_map('serialize', $arr); 
     $u = array_unique($s); 
     $arr = array_intersect_key($arr, $u); 

     /*-----(sort based on venue)------*/ 
     usort($arr, function($a, $b) { 
      return $a['venue'] <=> $b['venue']; 
     }); 

     /*----(edit, order on dates)----*/ 
     foreach($arr as $k => $a) 
     { 
      $t = explode('-',$a['date']); 
      $arr[$k]['t_date'] = isset($t[0]) ? $t[0] :null; 
     } 

     usort($arr, function($a, $b) { 
      return $a['t_date'] <=> $b['t_date']; 
     }); 

     /*----(output)----*/ 
     foreach($arr as $a) 
     { 
      foreach($a as $k => $v) 
      { 
       echo $k == 'venue' ? $v : $k.' '.$v; 
       echo '<br>'; 
      } 
      echo '<br>'; 
     }