2017-10-12 30 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>'; 
     }