2012-12-21 2 views
1

나는 날짜의 배열이 내림차순으로 내림차순으로 배열되어 있습니다. 루프를 반복하면서 현재 문자열을 분할하고 현재 연도 & 월을 사용하여 비교합니다.PHP를 사용하여 날짜 배열을 3 레벨 중첩 목록으로 바꾸는 방법

<ul> 
    <li><h1>2012</h1> 
<ul> 
<li><h2>Jan</h2> 
    <ul> 
    <li>Jan 1, 2012</li> 
    <li>Jan 5, 2012</li> 
    </ul> 
</li> 
<li><h2>Feb</h2> 
    <ul> 
    <li>Feb 3, 2012</li> 
    <li>Feb 8, 2012</li> 
    </ul> 
</li> 
</ul> 
    </li> 
    <li><h1>2011</h1> 
<ul> 
<li><h2>Jan</h2> 
    <ul> 
    <li>Jan 2, 2011</li> 
    <li>Mar 2, 2011</li> 
    </ul> 
</li> 
<li><h2>Feb</h2> 
    <ul> 
    <li>Feb 9, 2011</li> 
    <li>Feb 20, 2011</li> 
    </ul> 
</li> 
</ul> 
    </li> 
    </ul> 

이 내 시도 중 하나입니다 :

$archiveDateHTML = '<ul id="menu">'; 
$c = 0; 

foreach ($ArchiveDates as $k=>$value){ 
$dateArray = split(' ', $value); 

if($currentYear !== $dateArray[2] && $c+1 < count($ArchiveDates)){ 
    if($c > 0){ $archiveDateHTML .= '</ul>';} 
    $archiveDateHTML .= '<h2 class="yearTitle">'.$dateArray[2].'</h2>'; 
    $archiveDateHTML .= '<ul class="yearList">'; 
    $newYear = 1; 
} 
if($currentMonth !== $dateArray[0] && $c+1 < count($ArchiveDates)){ 
    if($c > 0 && $newYear==0){ $archiveDateHTML .= '</ul>';} 
    $archiveDateHTML .= '<h3 class="monthTitle">'.$dateArray[0].'</h3>'; 
    $archiveDateHTML .= '<ul class="monthList">'; 
    $newYear = 0; 
} 

$archiveDateHTML .= $value; 

$currentYear = $dateArray[2]; 
$currentMonth = $dateArray[0]; 
$c++; 
} 
$archiveDateHTML .= '</ul>'; 

몇 가지 명백한 문제가있다, 위의 코드와 여기에

는 원하는 출력 (예)입니다. 나는 계속 가까워지고 있지만 논리를 둘러싸고 머리를 감싸고있는 것은 아닙니다. 도와 주셔서 감사합니다.

답변

0

, 이것은 내 대답입니다 :

$dates = array(
    'Jan 1, 2012', 
    'Jan 5, 2012', 
    'Feb 3, 2012', 
    'Feb 8, 2012', 
    'Jan 2, 2011', 
    'Mar 2, 2011', 
    'Feb 9, 2011', 
    'Feb 20, 2011'); 

$out = array(); 

foreach ($dates as $date) { 
    list($m, $d, $y) = explode(" ", $date); 
    $out[$y][$m][] = $date; 
} 

foreach ($out as $year => $group) { 
    echo "<ul>\n"; 
    echo " <li><h1>$year</h1>\n"; 
    echo " <ul>\n"; 
    foreach ($group as $month => $dates) { 
    echo " <li><h2>$month</h2>\n"; 
    echo "  <ul>\n"; 
    foreach ($dates as $date) { 
     echo "  <li>$date</li>\n"; 
    } 
    echo "  </ul>\n"; 
    echo " </li>\n"; 
    } 
    echo " </ul>\n"; 
    echo " </li>\n"; 
    echo "</ul>\n"; 
} 

OUTPUT

<ul> 
    <li><h1>2012</h1> 
    <ul> 
    <li><h2>Jan</h2> 
     <ul> 
     <li>Jan 1, 2012</li> 
     <li>Jan 5, 2012</li> 
     </ul> 
    </li> 
    <li><h2>Feb</h2> 
     <ul> 
     <li>Feb 3, 2012</li> 
     <li>Feb 8, 2012</li> 
     </ul> 
    </li> 
    </ul> 
    </li> 
</ul> 
<ul> 
    <li><h1>2011</h1> 
    <ul> 
    <li><h2>Jan</h2> 
     <ul> 
     <li>Jan 2, 2011</li> 
     </ul> 
    </li> 
    <li><h2>Mar</h2> 
     <ul> 
     <li>Mar 2, 2011</li> 
     </ul> 
    </li> 
    <li><h2>Feb</h2> 
     <ul> 
     <li>Feb 9, 2011</li> 
     <li>Feb 20, 2011</li> 
     </ul> 
    </li> 
    </ul> 
    </li> 
</ul> 
+0

선생님. 많이. 나는 list() 함수를 항상 잊지 만, 편리하다. 고마워요, 고마워요! – hzane

2

다음은 어떻게 수행할까요? 원하는 출력 데이터 구조를 생성 한 다음 반복하여 ul/li 요소를 출력하십시오.

HTML이 유효한지 확실하지 않지만 쉽게 수정할 수 있어야합니다. PHP에서 데이터를 조작 할 때 첫 번째 반복 작업 동안 조작 및 출력을 수행하는 것이 결코 좋은 생각이 아닙니다. 그것은 당신의 코드를 훨씬 더 복잡하게 만듭니다. 항상 문제를 분석해보십시오. paulgrav 유사

<? 

$dates = array("2012 Jan 1","2012 Jan 2","2012 Feb 4"); 
$output = array(); 
foreach($dates as $date) { 
    list($year, $month, $day) = split(' ', $date); 
    $output[$year][$month][] = $day; 
} 

foreach($output as $year => $months) { 
    print <<<HTML 
    <ul> 
    <li><h1>$year</h1> 
<ul> 
HTML; 

    foreach($months as $month => $days) { 
     print <<<HTML 
     <li><h2>$month</h2> 
    <ul> 
HTML; 

     print "<li>$month $day, $year</li>\n"; 

    print <<<HTML 
    </ul> 
</li> 
HTML; 


    } 

    print <<<HTML 
    </ul> 
    </li> 
    </ul> 
HTML; 


} 
+0

사용 @의 sberry의 에코, 그들은 깔끔한입니다. 나는 당신의 질문에서 붙여 넣기를 복사하기가 더 쉽기 때문에 heredocs만을 사용했다. – paulgrav

+0

아주 좋습니다! 정말 고맙습니다! – hzane

관련 문제