缺少构建JavaScript对象PHP循环的字符

时间:2013-08-06 01:14:32

标签: php javascript arrays json multidimensional-array

尝试使用许多嵌套循环和方法来构建此JavaScript块,我需要专家帮助。我遍历所有'menuitems',而menu_item_parent 0的那些是顶级父级,其余的我构建较低级别。

如何在这些循环中添加缺少的两个字符?

它缺少一个逗号

,
每次

{'name' : '','url':'','subs':[
{'_id:':'1','title': '','img': ''}
,{'_id:':'1','title': '','img': ''}
]}

功能

    function make_menu_object(){
    $menu_name = 'sec_level';
    $menu = wp_get_nav_menu_object( $menu_name );
    $menuitems = wp_get_nav_menu_items( $menu->term_id, array( 'order' => 'DESC' ) );
    $objpart=null;

    $menuitems_count = count($menuitems);
    $master_counter = 0;

    foreach( $menuitems as $item ){

        // get page id from using menu item object id
        $id = get_post_meta( $item->ID, '_menu_item_object_id', true );
        // set up a page object to retrieve page data
        $page = get_page( $id );
        $link = get_page_link( $id );
        // item does not have a parent so menu_item_parent equals 0 (false)    

        if ( $item->menu_item_parent==0 ){
            if($master_counter<>0){$objpart.=']},';}
            $objpart .= <<<EOT

'$item->title' : {
'url':'',
'sections': [

EOT;
        }else{

        $counter=1;
        $the_star=1;



        $objpart .= <<<EOT
{'name' : '$item->title','url':'','subs':   [

EOT;
            $args = array( 'numberposts' => 4, 'offset'=> 0, 'post_type' => 'post', 'category' => $item->object_id);
            $myposts = get_posts( $args );

            $the_count = count($myposts);
            foreach( $myposts as $post ) {//subs output into js object
                setup_postdata($post);
                $the_empty_thumbnail = '/wp-content/uploads/2013/03/holder_img_menu.jpg';
                $the_thumbnail = get_the_post_thumbnail($post->ID, 'thumbnail');
                //$the_thumbnail_img = (!empty($the_thumbnail) ? the_post_thumbnail() : $the_empty_thumbnail);
                $the_post_title = addslashes($post->post_title);
                $objpart .= <<<EOT
{'_id:':'1','title': '','img': ''}

EOT;
                if($counter<$the_count){$objpart .= ',';}
                    $counter++;
                }


            if($the_star==1||$the_star==$counter){$objpart .=']}';}else{$objpart .=',';}
                $the_star++;
        }

        $master_counter++;
    }
$objpart .=']}';

return '<pre>'.$objpart.'</pre>';

}

当前输出

'Item 1' : {'url':'','sections': [
    {'name' : '','url':'','subs':[
      {'_id:':'1','title': '','img': ''}
      ,{'_id:':'1','title': '','img': ''}
      ]}

    {'name' : '','url':'','subs':   [
    {'_id:':'1','title': '','img': ''}
    ,{'_id:':'1','title': '','img': ''}
    ,{'_id:':'1','title': '','img': ''}
    ,{'_id:':'1','title': '','img': ''}
    ]}

  ]},

    'Item 2' : {
    'url':'',
    'sections': [
    {'name' : '','url':'','subs':   [
    {'_id:':'1','title': '','img': ''}
    ]}]}

所需输出

'Item 1' : {'url':'','sections': [
    {'name' : '','url':'','subs':[
      {'_id:':'1','title': '','img': ''}
      ,{'_id:':'1','title': '','img': ''}
      ]}
    ,
    {'name' : '','url':'','subs':   [
    {'_id:':'1','title': '','img': ''}
    ,{'_id:':'1','title': '','img': ''}
    ,{'_id:':'1','title': '','img': ''}
    ,{'_id:':'1','title': '','img': ''}
    ]}

  ]},

    'Item 2' : {
    'url':'',
    'sections': [
    {'name' : '','url':'','subs':   [
    {'_id:':'1','title': '','img': ''}
    ]}]}

2 个答案:

答案 0 :(得分:1)

正如您对问题的评论所述,您应该在PHP中创建对象,然后使用json_encode。

同样如评论中所提到的,将代码重写为答案太复杂了。

但要指出正确的方向,一些伪代码来展示如何构建PHP对象:

function make_menu_object() {
    $itemsForJS = new array(); // Initialize an empty array to hold the menu items

    // Code to retrieve the menu items
    // ...

    $currTopLevelNode = null; // Because output from WP is flat list, state is needed

    foreach ( $menuitems as $item ) {
        // Code to retrieve data about the menu item
        // ...

        if ( $item->menu_item_parent==0 ) {
            $currTopLevelNode = new stdClass; // Initialize an empty object 
            $currTopLevelNode->url = ''; // Or something more interesting... 
            $currTopLevelNode->sections = array(); // Empty holder for the sections to come
            $itemsForJS[$item->title] = $currTopLevelNode; 
        } else {
            $section = new stdClass; 
            $section->name = ''; // Or something more interesting
            $section->url = ''; // Or maybe $item->url? 
            $section->subs = array(); // Empty array to hold data for the subs

            // Code to retrieve post
            // ... 

            foreach ($mypost as $post) {
                $sub = new stdClass; // Empty object to hold data for the page

                // Code to retrieve data about the post
                // ...

                $sub->id = '1'; // Or maybe $post->post_id? 
                $sub->title = ''; // Maybe $post->post_title? 
                $sub->url = ''; // Maybe $post->post_url? 

                $section->subs[] = $sub; // Adding the post to the section
            }

            $currTopLevelNode->sections[] = $section; // Adding the section to the item
        }
    }
    return $itemsForJS; // This is an associative array, not string as in your code
}

使用此功能类似于:

$menuObject = make_menu_object(); 
echo '<pre>'.json_encode($menuObject).'</pre>'; 

当然,这是伪代码。例如,它假定收到的第一个$item必须是顶级的 - 或$currTopLevelNode将为null并且代码将崩溃。需要错误检查。

答案 1 :(得分:0)

if ( $item->menu_item_parent==0 ){
    $objpart .= "]}";
}

在第二个if

之后添加