2012-10-07 37 views
10

से मैं PHP में एक सरणी है बनाएं, जो इस प्रकार है:नेस्टेड सूची बहुआयामी सरणी

array (
    [0] => array (
     [id] => 1 
     [title] => "Title 1" 
     [parent_id] => NULL 
     [depth] => 0 
    ) 
    [1] => array (
     [id] => 2 
     [title] => "Title 2" 
     [parent_id] => NULL 
     [depth] => 0 
    ) 
    [2] => array (
     [id] => 3 
     [title] => "Title 3" 
     [parent_id] => 2 
     [depth] => 1 
    ) 
    [3] => array (
     [id] => 4 
     [title] => "Title 4" 
     [parent_id] => 2 
     [depth] => 1 
    ) 
    [4] => array (
     [id] => 5 
     [title] => "Title 5" 
     [parent_id] => NULL 
     [depth] => 0 
    ) 
    [5] => array (
     [id] => 6 
     [title] => "Title 6" 
     [parent_id] => 4 
     [depth] => 2 
    ) 
) 

क्या मैं करना चाहता हूँ इस सरणी पर पुनरावृति है और इसे से एक नेस्टेड <ol> सूची बनाते हैं। तो परिणाम इस तरह दिखना चाहिए:

<ol> 
    <li>Title 1</li> // id = 1 
    <li>Title 2</li> // id = 2 
    <ol> 
     <li>Title 3</li> // id = 3 -> parent_id = 2 
     <li>Title 4</li> // id = 4 -> parent_id = 2 
     <ol> 
      <li>Title 6</li> // id = 6 -> parent_id = 4 
     </ol> 
    </ol> 
    <li>Title 5</li> // id = 5 
</ol> 

मैं इस तरह से सोचने की कोशिश कर रहा हूं कि मैं यह कैसे कर सकता हूं। लेकिन अब तक हर प्रयास विफल रहा है ...

कोई भी कोई विचार है कि मैं इस तरह की एक नेस्टेड <ol> सूची कैसे बना सकता हूं?

कृपया ध्यान दें कि मेरे पास दिए गए डेटा पर कोई नियंत्रण नहीं है। मैं बस एक एपीआई को कॉल करता हूं और यह जेसन डेटा देता है, जिसे मैं एक सरणी में परिवर्तित करता हूं। और सरणी ठीक उसी तरह दिखती है जैसा मैंने वर्णन किया था।

+0

सतह पर यह आसान दिखता है, लेकिन मुझे लगता है कि आपकी स्थिति के लिए सबसे अच्छा जवाब पाने के लिए आपको अभी भी जानकारी की कमी है। सबसे पहले, आपको सरणी कैसे मिली? क्या यह डेटाबेस से है? क्या इसे अलग-अलग स्टोर करना संभव होगा या आप इस तरह से फंस गए हैं? क्या गहराई (अब या भविष्य में) 1 या 2 से अधिक होने की गारंटी नहीं है या क्या आप कभी भी उप-स्तरों की अनिश्चित संख्या करने की योजना बना रहे हैं? श्रेणियों को कितनी बार जोड़ा या हटाया जाएगा? मैं सुझाव दूंगा कि आप http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ देखें क्योंकि एक नेस्टेड मॉडल आपको और भी चाहिए। – Mike

उत्तर

13

आप प्रत्यावर्तन उपयोग करना चाहिए:

'php' वाक्य रचना में सबसे पहले सरणी:

<?php 
$a=array (
    '0' => array (
     'id' => 1, 
     'title' => "Title 1", 
     'parent_id' => 'NULL', 
     'depth' => 0 
    ), 
    '1' => array (
     'id' => 2, 
     'title' => "Title 2", 
     'parent_id' => 'NULL', 
     'depth' => 0 
    ), 
    '2' => array (
     'id' => 3, 
     'title' => "Title 3", 
     'parent_id' => 2, 
     'depth' => 1 
    ), 
    '3' => array (
     'id' => 4, 
     'title' => "Title 4", 
     'parent_id' => 2, 
     'depth' => 1 
    ), 
    '4' => array (
     'id' => 5, 
     'title' => "Title 5", 
     'parent_id' => 'NULL', 
     'depth' => 0 
    ), 
    '5' => array (
     'id' => 6, 
     'title' => "Title 6", 
     'parent_id' => 4, 
     'depth' => 0 
    ) 
); 

यहाँ कोड:

$level = 'NULL'; 

function r($a, $level) { 
    $r = "<ol>"; 
    foreach ($a as $i) { 
     if ($i['parent_id'] == $level) { 
      $r = $r . "<li>" . $i['title'] . r($a, $i['id']) . "</li>"; 
     } 
    } 
    $r = $r . "</ol>"; 
    return $r; 
} 

print r($a, $level); 

?> 

परिणाम:

<ol><li>Title 1<ol></ol></li><li>Title 2<ol><li>Title 3<ol> 
</ol></li><li>Title 4<ol><li>Title 6<ol></ol></li></ol></li></ol></li><li>Title 5 
<ol></ol></li></ol> 
  1. शीर्षक 1 \ N
    1. शीर्षक 2 \ N
      1. शीर्षक 3 \ N
        1. शीर्षक 4 \ N
          1. शीर्षक 6 \ N
        2. शीर्षक 5 \ एन

          जांच समाधान के रूप में के बाद संपादित

          खाली लीफ़्स बचने के लिए:

          function r($a, $level) { 
              $r = '' ; 
              foreach ($a as $i) { 
               if ($i['parent_id'] == $level) { 
                $r = $r . "<li>" . $i['title'] . r($a, $i['id']) . "</li>"; 
               } 
              } 
              return ($r==''?'':"<ol>". $r . "</ol>"); 
          } 
          
          4

          आप निम्न

          $array = array (
              "0" => array (
               "id" => 1, 
               "title" => "Title 1", 
               "parent_id" => NULL, 
               "depth" => 0 
              ), 
              "1" => array (
               "id" => 2, 
               "title" => "Title 2", 
               "parent_id" => NULL, 
               "depth" => 0 
              ), 
              "2" => array (
               "id" => 3, 
               "title" => "Title 3", 
               "parent_id" => 2, 
               "depth" => 1 
              ), 
              "3" => array (
               "id" => 4, 
               "title" => "Title 4", 
               "parent_id" => 2, 
               "depth" => 1 
              ), 
              "4" => array (
               "id" => 5, 
               "title" => "Title 5", 
               "parent_id" => NULL, 
               "depth" => 0 
              ), 
              "5" => array (
               "id" => 6, 
               "title" => "Title 6", 
               "parent_id" => 4, 
               "depth" => 0 
              ) 
          ); 
          
          echo(make($array)); 
          

          आउटपुट कोशिश कर सकते हैं

          <ol> 
              <li>Title 1</li> 
              <li>Title 2</li> 
              <ol> 
               <li>Title 3</li> 
               <li>Title 4</li> 
               <ol> 
                <li>Title 6</li> 
               </ol> 
              </ol> 
              <li>Title 5</li> 
          </ol> 
          

          समारोह प्रयुक्त

          function make(array $array, $no = 0) { 
              $child = hasChildren($array, $no); 
              if (empty($child)) 
               return ""; 
              $content = "<ol>\n"; 
              foreach ($child as $value) { 
               $content .= sprintf("\t<li>%s</li>\n", $value['title']); 
               $content .= make($array, $value['id']); 
              } 
              $content .= "</ol>\n"; 
              return $content; 
          } 
          
          function hasChildren($array, $id) { 
              return array_filter($array, function ($var) use($id) { 
               return $var['parent_id'] == $id; 
              }); 
          } 
          

          See Live Demo

          +1

          महान उत्तर धन्यवाद। क्या आप मुझे बता सकते हैं कि हम अधिकतम गहराई को कैसे मान सकते हैं कि सरणी तत्वों की कोई गहराई कुंजी नहीं है (जैसा कि मुझे नहीं मिला है) ..हमें लगता है कि हमें '$ स्तर = 0; 'और' $ max_level = 3' चाहिए। लेकिन उन्हें अपने काम में कैसे रखा जाए? –

          +0

          @ बाबा, वह एक अच्छा स्थान बनाता है। आशा है कि आपको इसकी समीक्षा करने के लिए समय लगेगा। –

          1

          निम्नलिखित सरणी:

          Array 
          (
              [0] => Content 
              [1] => Array 
               (
                [0] => International 
                [1] => Array 
                 (
                  [0] => Mexico 
                  [1] => Array 
                   (
                    [0] => Tamaulipas 
                   ) 
          
                  [2] => USA 
                 ) 
          
               ) 
          
          ) 
          

          इस समारोह के साथ:

          function r($element) { 
              foreach ($element as $value) { 
               if (!is_array($value)) { 
                echo "<li>"; 
                echo $value; 
               } else { 
                echo "<ul>"; 
                r($value); 
                echo "</li>"; 
                echo "</ul>"; 
               } 
              } 
          } 
          

          PHP कोड:

          echo "<ul>"; 
          r($array); 
          echo "</ul>"; 
          

          रिटर्न:

          <ul> 
              <li>Public</li> 
              <li>User</li> 
              <li>Content 
               <ul> 
                <li>International 
                 <ul> 
                  <li>Mexico 
                   <ul> 
                    <li>Tamaulipas</li> 
                   </ul> 
                  </li> 
                  <li>USA</li> 
                 </ul> 
                </li> 
               </ul> 
              </li> 
          </ul> 
          
          संबंधित मुद्दे