2013-05-19 2 views
0

Для сайта wordpress, который я разрабатываю, я создаю динамическое меню, которое пользователи могут использовать с помощью меню администратора. Присоединение к этому - это только наименьшая из моих проблем.Изменение коллекции PHP

код я использую возвращает эти массивы:

     Array 
(
    [0] => WP_Post Object 
     (
      [ID] => 35 
      [post_author] => 1 
      [post_date] => 2013-05-19 15:46:22 
      [post_date_gmt] => 2013-05-19 15:46:22 
      [post_content] => 
      [post_title] => 
      [post_excerpt] => 
      [post_status] => publish 
      [comment_status] => open 
      [ping_status] => open 
      [post_password] => 
      [post_name] => 35 
      [to_ping] => 
      [pinged] => 
      [post_modified] => 2013-05-19 16:07:09 
      [post_modified_gmt] => 2013-05-19 16:07:09 
      [post_content_filtered] => 
      [post_parent] => 0 
      [guid] => http://adapt.local/?p=35 
      [menu_order] => 1 
      [post_type] => nav_menu_item 
      [post_mime_type] => 
      [comment_count] => 0 
      [filter] => raw 
      [db_id] => 35 
      [menu_item_parent] => 0 
      [object_id] => 32 
      [object] => training 
      [type] => post_type 
      [type_label] => Training 
      [url] => http://adapt.local/training/alcohol/ 
      [title] => Alcohol 
      [target] => 
      [attr_title] => 
      [description] => 
      [classes] => Array 
       (
        [0] => 
       ) 

      [xfn] => 
     ) 

    [1] => WP_Post Object 
     (
      [ID] => 36 
      [post_author] => 1 
      [post_date] => 2013-05-19 16:07:09 
      [post_date_gmt] => 2013-05-19 16:07:09 
      [post_content] => 
      [post_title] => 
      [post_excerpt] => 
      [post_status] => publish 
      [comment_status] => open 
      [ping_status] => open 
      [post_password] => 
      [post_name] => 36 
      [to_ping] => 
      [pinged] => 
      [post_modified] => 2013-05-19 16:07:09 
      [post_modified_gmt] => 2013-05-19 16:07:09 
      [post_content_filtered] => 
      [post_parent] => 0 
      [guid] => http://adapt.local/?p=36 
      [menu_order] => 2 
      [post_type] => nav_menu_item 
      [post_mime_type] => 
      [comment_count] => 0 
      [filter] => raw 
      [db_id] => 36 
      [menu_item_parent] => 35 
      [object_id] => 32 
      [object] => training 
      [type] => post_type 
      [type_label] => Training 
      [url] => http://adapt.local/training/alcohol/ 
      [title] => Alcohol 
      [target] => 
      [attr_title] => 
      [description] => 
      [classes] => Array 
       (
        [0] => 
       ) 

      [xfn] => 
     ) 

) 

Чтобы объяснить: если menu_item_parent = 0, что означает, что он является одним из главных узлов, и если menu_item_parent> 0, это означает, что она является " подузел.

Я хочу, чтобы преобразовать этот ужасный массив к чему-то более полезное, предпочтительно что-то вроде этого

Array 
(
    [35] => Array 
    (
     name => "Topnode" 
     url => "http://topnodeurl" 
     items => Array 
     (
      name => "Subnode" 
      url => "http://subnodeurl" 
     ) 
    ) 
) 

Я подумал: Эй, это не может быть так сложно. Но, по-видимому, это, похоже, не работает:

foreach($menuitems as $menuitem) { 
    if(!$menuitem->menu_item_parent) { 
     $items[$menuitem->ID] = array("name" => $menuitem->title,"items" => array()); 
     #print_r($items); 
    } 
    else { 
     $parent = $items[$menuitem->menu_item_parent]['items']; 
     $parent = array("name" => $menuitem->title, "url" => $menuitem->url); 
    } 
} 

Любые идеи?

ответ

2

Сделать рекурсивную функцию

function make_menu($items, $parent_id = 0) 
{ 
    $menu = []; 
    foreach($items as $key => $item) { 
     if (item['menu_item_parent'] == $parent_id) { 
      $item['childs'] = make_menu($items, $item['ID']); 
      $menu[] = $item; 

      // Helps speed up the foreach by removing items that are not needed any more 
      unset($item[$key]); 
     } 
    } 

    return $menu; 
} 

Таким образом, вы можете иметь более глубокую функцию затем только 1 слой

+0

Как это будет работать? Я не верю, что $ items ['childs'] будет делать что-то, поскольку рекурсивная функция ничего не возвращает? –

+0

Извините, что я плохо забыл вернуть меню – MKroeders

+0

Отлично! Кажется, это делает работу. Теперь я не должен беспокоиться обо всех «дополнительных данных». Это просто все. –

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