Laat alleen het laatste item in serie zien

Ik probeer erachter te komen waarom het alleen de laatste child_links in het rooster, evenementen en sociale objecten laat zien. Ik heb de site met de print_r van de arrayfunctie opgenomen. Alle hulp wordt op prijs gesteld.

http://kansasoutlawwrestling.com/

function getSubMenuPages()
{
    $this->db->select('id');
    $this->db->where('short_name', 'mainnav'); 
    $query = $this->db->get('site_menu_structures'); 
    $menu_id = $query->row()->id; 

    $this->db->select('id, short_name, is_category');
    $this->db->where('menu_structure_id', $menu_id); 
    $query = $this->db->get('site_menu_structures_links');

    if ($query->num_rows() > 0) 
    {
        $linksArray = $query->result();
        echo "
";
        print_r( $linksArray );
        echo "
"; foreach ($linksArray as $key => $link) { if ($link->is_category == 'Yes') { $this->db->select('link_name, site_content_pages_id, link_url'); $this->db->where('site_menu_structures_links_id', $link->id); $query = $this->db->get('site_menu_structures_links_children'); if ($query->num_rows() > 0) { foreach ($query->result() as $row) { $site_content_page_id = $row->site_content_pages_id; $linksArray[$key]->child_links = array(); if ($site_content_page_id != 0) { $this->db->select('content_page_name, permalink'); $this->db->where('id', $site_content_page_id); $query = $this->db->get('site_content_pages'); if ($query->num_rows() > 0) { $row = $query->row(); $linksArray[$key]->child_links = array( 'link_name' => $row->content_page_name, 'link_url' => $row->permalink ); } } else { $linksArray[$key]->child_links = array( 'link_name' => $row->link_name, 'link_url' => $row->link_url ); } } } } } } return $linksArray; }
1

2 antwoord

Wanneer je hier loopt:

foreach ($query->result() as $row)
                    {
                        $site_content_page_id = $row->site_content_pages_id;
                        $linksArray[$key]->child_links = array();
                        if ($site_content_page_id != 0)
                        {

je zit in een andere lus, dus bij elke passage van deze lus blijft de $ -toets hetzelfde.

Dus 1e externe lus , ex. $ key = 'key1'; Ik zal wat pseudo-code gebruiken om het idee te geven:

foreach results as row:
  (loop nr 1):
     linksarray['key1'] = empty array.
     linksarray['key1'] = value;
  (loop nr 2):
     linksarray['key1'] = empty array
     linksarray['key1'] = value2
endforeach;

2nd external loop, $Key = 'key2'

   foreach results as row:
      (loop nr 1):
         linksarray['key2'] = empty array.
         linksarray['key2'] = value;
      (loop nr 2):
         linksarray['key2'] = empty array
         linksarray['key2'] = value2
    endforeach;

Ik heb misschien in al die loops iets verkeerd gezien, het is hier 's avonds en ik ben een beetje moe :)


Oh, en een stukje advies: je code wordt gemakkelijk een beetje moeilijk te lezen; een kleine verbetering zou zijn om de tabelnaam weg te laten (omdat het niet nodig is), vooral als het zo lang is; bovendien kun je in AR de "van" -clausule en ook de kettingmethode weglaten.

Dus bijvoorbeeld voor:

$this->db->select('site_menu_structures_links_children.link_name, site_menu_structures_links_children.site_content_pages_id, site_menu_structures_links_children.link_url');
$this->db->from('site_menu_structures_links_children');
$this->db->where('site_menu_structures_links_children.site_menu_structures_links_id', $link->id);
$query = $this->db->get();

Kan gemakkelijk worden herschreven als:

$query = $this->db->select('link_name,site_content_pages_id,link_url')
                  ->where('site_menu_structures_links_id',$link->id)
                  ->get('site_menu_structures_links_children');

Dit zou u kunnen helpen bij het identificeren van de algemene codestroom, het opsporen van de verschillende runs

UPDATE

Probeer dit

function getSubMenuPages()
{
    $this->db->select('id');
    $this->db->where('short_name', 'mainnav'); 
    $query = $this->db->get('site_menu_structures'); 
    $menu_id = $query->row()->id; 

    $this->db->select('id, short_name, is_category');
    $this->db->where('menu_structure_id', $menu_id); 
    $query2 = $this->db->get('site_menu_structures_links');

    if ($query2->num_rows() > 0) 
    {
        $linksArray = $query2->result();
        echo "
";
        print_r( $linksArray );
        echo "
"; foreach ($linksArray as $key => $link) { if ($link->is_category == 'Yes') { $this->db->select('link_name, site_content_pages_id, link_url'); $this->db->where('site_menu_structures_links_id', $link->id); $query3 = $this->db->get('site_menu_structures_links_children'); if ($query3->num_rows() > 0) { $linksArray[$key]->child_links = array(); foreach ($query3->result() as $row) { $site_content_page_id = $row->site_content_pages_id; //$linksArray[$key]->child_links = array(); if ($site_content_page_id != 0) { $this->db->select('content_page_name, permalink'); $this->db->where('id', $site_content_page_id); $query4 = $this->db->get('site_content_pages'); if ($query4->num_rows() > 0) { $row = $query4->row(); $linksArray[$key]->child_links[]['link_name'] = $row->content_page_name; $linksArray[$key]->child_links[]['link_url'] = $row->permalink; } } else { $linksArray[$key]->child_links[]['link_name'] = $row->link_name; $linksArray[$key]->child_links[]['link_url'] = $row->link_url; } } } } } } return $linksArray; }

basically, I moved the property assigment $linksArray[$key]->child_links = array(); outside the loop. Being followed by another loop, which can possibly have more values, I've created an index for each loop:

$linksArray[$key]->child_links[]['link_name'] = $row->content_page_name;
$linksArray[$key]->child_links[]['link_url'] = $row->permalink;
4
toegevoegd
Fantastisch werk, maar het valt niet erg goed in me weg. Ik probeer uit te vinden hoe ik het op het mijne kan toepassen.
toegevoegd de auteur Jeff Davidson, de bron
Bedankt dat ik dat gedaan heb en zal updaten met mijn nieuwe code. Nog steeds geen oplossing.
toegevoegd de auteur Jeff Davidson, de bron
Dat deed ik en het enige probleem was dat het een nieuwe array maakte met link_name en link_url, ze zouden op dezelfde moeten staan.
toegevoegd de auteur Jeff Davidson, de bron
@JeffDavidson heeft mijn antwoord bijgewerkt met een suggestie; kan het niet testen, probeer het eens
toegevoegd de auteur Damien Pirsy, de bron

Probeer dit codeblok te vervangen:

$this->db->select('link_name, site_content_pages_id, link_url');
$this->db->where('site_menu_structures_links_id', $link->id); 
$query = $this->db->get('site_menu_structures_links_children');
if ($query->num_rows() > 0) 
{
    $linksArray[$key]->child_links = array();

    foreach ($query->result() as $row)
    {
        $site_content_page_id = $row->site_content_pages_id;

        if ($site_content_page_id != 0)
        {
            $this->db->select('content_page_name, permalink');
            $this->db->where('id', $site_content_page_id); 
            $query2 = $this->db->get('site_content_pages');
            if ($query2->num_rows() > 0)
            {
                $row2 = $query2->row(); 
                array_push($linksArray[$key]->child_links, array(
                                                'link_name'  => $row2->content_page_name,
                                                'link_url' => $row2->permalink
                                             ));
            }
        }
        else
        {
            array_push($linksArray[$key]->child_links, array(
                                                'link_name'  => $row->link_name,
                                                'link_url' => $row->link_url
                                             ));
        }
    }
}
1
toegevoegd