2014-09-23 3 views
-3

Я следующий массив, который должен отображаться как навигацияОтображение массива списка смежности с помощью PHP

[items] => Array 
     (
      [Electronics] => Array 
       (
        [level2] => Array 
         (
          [Home Use] => Array 
           (
            [level3] => Array 
             (
              [Laptops] => Array 
               (
                [level4] => Array 
                 (
                  [0] => HP A very simple laptop 
                  [1] => HP Tablet 
                  [2] => Acer Laptop 
                 ) 

               ) 

              [Desktops] => Array 
               (
                [level4] => Array 
                 (
                  [0] => Acer Tablet 
                 ) 

               ) 

              [Tablets] => Array 
               (
                [level4] => Array 
                 (
                  [0] => 
                 ) 

               ) 

             ) 

           ) 

          [Business] => Array 
           (
            [level3] => Array 
             (
              [Tablets] => Array 
               (
                [level4] => Array 
                 (
                  [0] => HP A very simple laptop 
                  [1] => HP Tablet 
                  [2] => Touchmate 
                 ) 

               ) 

              [Laptops] => Array 
               (
                [level4] => Array 
                 (
                  [0] => Compaq 
                  [1] => IBM 
                 ) 

               ) 

              [Desktop] => Array 
               (
                [level4] => Array 
                 (
                  [0] => Lenovo 
                 ) 

               ) 

             ) 

           ) 

         ) 

       ) 

      [Hotels] => Array 
       (
        [level2] => Array 
         (
          [5 Stars] => Array 
           (
            [level3] => Array 
             (
              [Daily Basis] => Array 
               (
                [level4] => Array 
                 (
                  [0] => Hilton 
                 ) 

               ) 

              [Montly Basis] => Array 
               (
                [level4] => Array 
                 (
                  [0] => Hilton 
                  [1] => Intercon 
                  [2] => Marina Hotel 
                  [3] => Galaxy Plaza Hotel 
                 ) 

               ) 

             ) 

           ) 

          [4 Stars] => Array 
           (
            [level3] => Array 
             (
              [Daily Basis] => Array 
               (
                [level4] => Array 
                 (
                  [0] => Address 
                 ) 

               ) 

              [Montly Basis] => Array 
               (
                [level4] => Array 
                 (
                  [0] => Armada Al Barsha Hotel 
                  [1] => Everest International Hotel 
                  [2] => New Hotel 
                  [3] => Good Hotel 
                 ) 

               ) 

             ) 

           ) 

          [3 Stars] => Array 
           (
            [level3] => Array 
             (
              [Daily Basis] => Array 
               (
                [level4] => Array 
                 (
                  [0] => Royal Garden Hotel 
                 ) 

               ) 

              [Montly Basis] => Array 
               (
                [level4] => Array 
                 (
                  [0] => Galaxy Plaza Hotel 
                 ) 

               ) 

             ) 

           ) 

         ) 

       ) 

      [Entertainment] => Array 
       (
        [level2] => Array 
         (
          [] => Array 
           (
            [level3] => Array 
             (
              [] => Array 
               (
                [level4] => Array 
                 (
                  [0] => 
                 ) 

               ) 

             ) 

           ) 

         ) 

       ) 

      [Services] => Array 
       (
        [level2] => Array 
         (
          [] => Array 
           (
            [level3] => Array 
             (
              [] => Array 
               (
                [level4] => Array 
                 (
                  [0] => 
                 ) 

               ) 

             ) 

           ) 

         ) 

       ) 

     ) 

) 

сейчас ... Я хочу, чтобы отобразить это в неупорядоченном списке. У меня есть следующая функция.

public function display($sorted_array) 
{ 


    $markup = ''; 

    foreach ($sorted_array as $key => $value) 
    { 

     if($key === 'Electronics' || $key ==='Hotels' || $key === 'Services' || $key === 'Entertainment') 
     { 
      $markup .= '<h1><li>'; 
     } 

     $markup .= (is_array($value)) ? '<b>'.$key.'</b></li></ul></h1>'.$this->display($value) : '<ul><li>'.$value. '</li></ul>'; 

    } 

    return '<ul>'.$markup . '</ul>'; 

} 

Electronics 

Home Use 

Laptops 

    HP A very simple laptop 
    HP Tablet 
    Acer Laptop 

Настольные компьютеры

Acer Tablet 

таблетки

Бизнес

Tablets 

    HP A very simple laptop 
    HP Tablet 
    Touchmate 

Ноутбуки

Compaq 
    IBM 

Desktop

Lenovo 

Отели

5 Stars 

Daily Basis 

    Hilton 

Все категории и подкатегории отображается в правильном порядке. Тем не менее, мне нужно знать, где я должен добавить идентификатор, чтобы добавить стили в подкатегории и поместить их соответствующим образом.

ответ

0

Если вы используете идентификатор, вы будете использовать идентификатор несколько раз, поэтому используйте класс вместо id. Один из способов - поддерживать счетчик, который представляет уровень. В соответствии с тем, что ваша функция работает правильно, вы получите примерно следующее:

public function strip($string) 
{ 
    $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens. 
    $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars. 
    $string = strtolower($string); //To lower case 
    return $string; 
} 

public function display($sorted_array, $level=0) 
{ 
    $level++; 

    $markup = ''; 

    foreach ($sorted_array as $key => $value) 
    { 

     if($key === 'Electronics' || $key ==='Hotels' || $key === 'Services' || $key === 'Entertainment') 
     { 
      $markup .= '<h1><li id="'.$this->strip($key).'" class="level-'.$level.'">'; 
     } 

     $markup .= (is_array($value)) ? '<b>'.$key.'</b></li></ul></h1>'.$this->display($value,$level) : '<ul><li id="'.$this->strip($key).'" class="level-'.$level.'">'.$value. '</li></ul>'; 

    } 

    return '<ul>'.$markup . '</ul>'; 
} 

Теперь вы можете использовать классы уровня в своем CSS.

.level-1 { 

} 
.level-2 { 

} 
... 
+0

Я пробовал это, но он присваивает level1 всем листовым узлам (последние узлы без дочернего элемента). Это рекурсивная функция. Если текущий ключ является массивом, имя ключа печатается, и массив снова передается в одну и ту же функцию, поэтому, когда текущий ключ является значением, он печатается. Проблема заключается в том, что на одной итерации значение должно быть печать может быть любой; родительский, дочерний, дочерний, суб-дочерний или ведущий узел. Как узнать уровни сейчас? –

+0

Итак, на одной итерации печатается ключ или значение VALUE. Массив организован и отлично отпечатан в правильном порядке. Все, что я хочу, это установить соответствующие идентификаторы, чтобы я мог стилизовать их как стандартную навигацию категорий и подкатегорий. –

+0

Этот уровень вещь должен работать. Поскольку ваша функция итеративна, она будет увеличиваться при повторном вызове функции. Я редактировал свой вопрос. Теперь каждый элемент 'li' будет иметь идентификатор. –

Смежные вопросы