2011-05-26 5 views
7

का निर्माण मैं PHP icio और ftrotter के महान उदाहरण द्वारा उत्पादित में एक बहुआयामी सरणी है (मैं कर रहा हूँ सरणियों संस्करण में उपयोग ftrotterrs सरणी):पीएचपी बिना क्रम वाली सूची के लिए बहुआयामी सरणी, url पथ

Turn database result into array

मैंने इसे इस विधि में एक अनियमित सूची चौड़ाई में बनाया है:

public function outputCategories($categories, $startingLevel = 0) 
{ 
    echo "<ul>\n"; 
    foreach ($categories as $key => $category) 
    { 
    if (count($category['children']) > 0) 
    { 
     echo "<li>{$category['menu_nl']}\n"; 
     $this->outputCategories($category['children'], $link 
           , $start, $startingLevel+1); 
     echo "</li>\n"; 
    } 
    else 
    { 
     echo "<li>{$category['menu_nl']}</li>\n"; 
    } 
    } 
    echo "</ul>\n"; 
} 

अब तक इतना अच्छा है।

अब मैं url_nl फ़ील्ड का उपयोग मेनू में लिंक के रूप में यूआरएल के उपयोग के लिए करना चाहता हूं। यूआरएल को पेड़ में नीचे जाने वाले प्रत्येक चरण के लिए/url_nl जोड़कर पेड़ में लिंक के डिप्टी को प्रतिबिंबित करना होता है।

मेरा लक्ष्य:

- item 1 (has link: /item_1) 
    * subitem 1 (has link: /item_1/subitem_1) 
    * subitem 2 (has link: /item_1/subitem_1) 
     * subsubitem 1 (has link: /item_1/subitem_2/subsubitem_1) 
- item 2 (has link: /item_2) 

तालिका

id 
id1 (parent id) 
menu_nl 
url_nl 
title_nl 
etc 

क्या मैं अब तक है: है

public function outputCategories($categories, $link, $start, $startingLevel = 0) 
{ 
    // if start not exists 
    if(!$start) 
    $start = $startingLevel; 

    echo "<ul>\n"; 
    foreach ($categories as $key => $category) 
    { 
    $link.= "/".$category['url_nl']; 

    if($start != $startingLevel) 
     $link = strrchr($link, '/'); 

    if (count($category['children']) > 0) 
    { 
     echo "<li>".$start." - ".$startingLevel. 
      "<a href='$link'>{$category['menu_nl']}</a> ($link)\n"; 
     $this->outputCategories($category['children'], $link 
           , $start, $startingLevel+1); 
     echo "</li>\n"; 
    } 
    else 
    { 
     $start = $startingLevel+1; 
     echo "<li>".$start." - ".$startingLevel. 
      "<a href='$link'>{$category['menu_nl']}</a> ($link)</li>\n"; 
    } 
    } 
    echo "</ul>\n"; 
} 

आप उदाहरण में देख के रूप में मैं एक url_nl क्षेत्र का इस्तेमाल किया है जो संक्षेप में जोड़ा गया है ताकि सूची के प्रत्येक स्तर में पथ के साथ एक लिंक हो जो यूआरएल के रूप में उपयोग किया जाता है।

किसी भी तरह, मुझे इन लिंक को बनाने में समस्याएं हैं, क्योंकि पदानुक्रम सूची में लूप करते समय उन्हें ठीक से रीसेट नहीं किया जाता है। सूची में बच्चे के पास जाने के बाद पहला व्यक्ति सही है लेकिन दूसरा नहीं।

मैं यहाँ अटक कर रहा हूँ ...

+0

आप 'if (! $ Start)' 'if (! Isset ($ start) 'के साथ' if (! $ Start) 'को प्रतिस्थापित करना चाहते हैं। – Johan

+0

अच्छा सुझाव! – Klaaz

उत्तर

1

ऐसा लगता है कि foreach पाश अंदर $ लिंक चर संशोधित, तो तुम अपने subitems के माध्यम से $ लिंक, पाश के लिए ITEM1 जोड़ सकते हैं और पहली यात्रा में लौटने और जोड़ने चर को ITEM2 ...

की जगह इस

$link .= "/".$category['url_nl']; 

साथ

$insidelink = $link . "/".$category['url_nl']; 

(और लूप के अंदर शेष $ लिंक को $ insidelink में बदलें)

जोड़ना: यह $ startLevel के लिए भी सच है।

echo "<li>".$start." - ".$startingLevel +1. 
    "<a href='$link'>{$category['menu_nl']}</a> ($link)</li>\n"; 
+0

मैंने इसे जल्दी बदल दिया क्योंकि मुझे अभी जाना है। अछा लगता है! स्पष्ट सोच यहां समाधान है, मेरा दिमाग थोड़ा परेशान था मुझे लगता है! धन्यवाद! – Klaaz

1

यहाँ एक आसान तरीका है:

$ inarray = अपने बहु-आयामी सरणी यहाँ इसे संशोधित मत करो, +1 इनलाइन का उपयोग करें। मैंने निर्देशिका की सामग्री को प्राप्त करने के लिए codeigniter में directory_map का उपयोग किया है जिसमें इसकी उपनिर्देशिकाएं शामिल हैं।

$this->getList($filelist2, $filelist); 
foreach ($filelist as $key => $val) { 
    echo $val; 
} 

function getList($inarray, &$filelist, $prefix='') { 
    foreach ($inarray as $inkey => $inval) { 
     if (is_array($inval)) { 
      $filelist = $this->getList($inval, $filelist, $inkey); 
     } else { 
      if ($prefix) 
       $filelist[] = $prefix . '--' . $inval; 
      else 
       $filelist[] = $inval; 
     } 
    } 

    return $filelist; 
} 
संबंधित मुद्दे