2011-02-08 5 views
0

배열을 올바르게 중첩 된 HTML로 변환하는 데 문제가 있습니다.데이터를 중첩 된 HTML에 배열

An, Author---Some Book 
Another, Author---A Book 
Another, Author---Another Book 
Be, Author---Book 1 
Be, Author---Book 2 
No, Author---Book 1 

방법 같은 조직 HTML로 그 차례 않습니다 - -

<div> 
    <div class="letter">A</div> 
    <div> 
     <div class="author">An, Author</div> 
     <div class="title">Some Book</div> 
    </div> 
    <div> 
     <div class="author">Another, Author</div> 
     <div class="title">A Book</div> 
     <div class="title">Another Book</div> 
    </div> 
<div> 
<div> 
    <div class="letter">B</div> 
    <div> 
     <div class="author">Be, Author</div> 
     <div class="title">Book 1</div> 
     <div class="title">Book 2</div> 
    </div> 
<div> 
<div> 
    <div class="letter">N</div> 
    <div> 
     <div class="author">No, Author</div> 
     <div class="title">Book 1</div> 
    </div> 
<div> 

나는 PHP와 어떤 문제가없는, 그냥 내가 그것이야 나는 다음과 같은 예제 값 배열을 가지고 가정 어떻게 데이터를 정리할 지 모르겠습니다. 데이터를 다시 가져 오기 전에 세 가지 배열 (Letters, Authors, Books)로 분할하십시오. 그렇다면 나는 어떻게 책들을 (편지 -> 저자 -> 책) 연관시킬 수 있을까?

어떤 아이디어 주셔서 감사합니다.

+0

먼저 튜토리얼을 살펴보아야합니다. 배열을 가로 지르는 방법 PHP –

+0

배열을 print_r 할 수 있습니까? 당신은 각 줄을 나누고 글자로 정렬 한 다음 표시된 것처럼 출력 할 함수를 작성하는 누군가가 필요합니까? – Jason

+0

문자열을 사용하여 배열을 탐색하는 방법 및 문자열을 탐색하는 방법을 알고 있습니다. 나는 PHP에 문제가 없다. 모든 것을 올바르게 중첩시키는 데 문제가 있습니다. 다른 데이터 구조로 옮겨야한다고 생각합니다. 어떻게 생겼는지 확실하지 않습니다. – usertest

답변

2

이 배열은 이미 예로 정렬됩니다 가정하면 샘플 배열에서

for ($i = 0; $i < count($array); $i++) { 
    $parts = explode("---", $array[$i]); 
    $author = $parts[0]; 
    $book = $parts[1]; 
    $letter = substr($author, 0, 1); 

    if (!isset($last_author) || $last_author != $author) { 

     if ($i > 0 && $last_letter != $letter) { 
       echo "\t</div>\n"; 
       echo "</div>\n"; 
     } else if ($i > 0) { 
       echo "\t</div>\n"; 
     } 

     if (!isset($last_letter) || $last_letter != $letter) { 
      echo "<div>\n"; 
      echo "\t" . '<div class="letter">' . strtoupper($letter) . '</div>' . "\n"; 
      $last_letter = $letter; 
     } 

     echo "\t<div>\n"; 

     echo "\t\t" . '<div class="author">' . $author . '</div>' . "\n"; 
     echo "\t\t" . '<div class="title">' . $book . '</div>' . "\n"; 

     $last_author = $author; 

    } else { 
     echo "\t\t" . '<div class="title">' . $book . '</div>' . "\n"; 
    } 

} 

if (count($array) > 0) echo "\t</div>\n</div>"; 

출력 :

<div> 
     <div class="letter">A</div> 
     <div> 
       <div class="author">An, Author</div> 
       <div class="title">Some Book</div> 
     </div> 
     <div> 
       <div class="author">Another, Author</div> 
       <div class="title">A Book</div> 
       <div class="title">Another Book</div> 
     </div> 
</div> 
<div> 
     <div class="letter">B</div> 
     <div> 
       <div class="author">Be, Author</div> 
       <div class="title">Book 1</div> 
       <div class="title">Book 2</div> 
     </div> 
</div> 
<div> 
     <div class="letter">N</div> 
     <div> 
       <div class="author">No, Author</div> 
       <div class="title">Book 1</div> 
     </div> 
</div> 
+0

고마워요. 전에 시도한 것과 비슷합니다. 문제는 첫 번째 문자가 같은 여러 작성자와 작동하지 않는다는 것입니다. 'A'로 시작하는 두 번째 작성자는 코드로 중첩되지 않으며 자체적으로 중첩됩니다. – usertest

+0

나는 무엇을 해야할지 알아낼 수 있다는 것을 확신합니다 ... 그것은 단지 더 많이 똑같습니다 ... –

+0

원하는 중첩으로 업데이트되었습니다 ... –

0

당신은 또한 렌더링 할 적은 코드를 필요로 할 수있는 다차원 배열을 생성 할 수 있습니다 :

$new = array(); 

for ($i = 0; $i < count($array); $i++) { 
    $parts = explode("---", $array[$i]); 
    $author = $parts[0]; 
    $book = $parts[1]; 
    $letter = substr($author, 0, 1); 

    $new[$letter][$author][] = $book; 
} 

foreach ($new as $letter => $authors) { 

    foreach ($authors as $author => $books) { 

     foreach ($books as $book) { 

     } 

    } 

} 
0

하지만 거기에 당신의 배열을 구문 분석 할 수 있습니다.

목록을 사용하여 의미 있고 의미가있는 것을 출력 해보십시오.