Rechercher le dernier enfant dans une fonction récursive – PHP – SitePoint Forums

Est-ce que le tableau parent_table ou parenttable la même table que ce que nous appelions categories plus tôt dans ce fil? Vous appelez aussi les choses pages qui pour moi est un enregistrement individuel de la categories ou parent_table mais si c’était moi j’appellerais la table pages car c’est ce que contient ce tableau. Toute autre table de base de données faisant référence au “pages” la table utiliserait un champ page_idqui fait référence au champ id de la pages table.

Une autre chose à noter à propos du code que vous avez publié est les requêtes imbriquées qui doivent être évitées dans la mesure du possible.

Dans MHO dans votre code que vous créez $gallery_id qui ne représente pas la valeur qu’il détient. Dans mon esprit gallery_id représenterait id de la galley table. Encore une fois, toutes les images d’une page doivent avoir un page_id pour le id of the tableau des pages.

La cohérence des termes est importante dans l’ensemble d’un projet, alors faites de votre mieux pour nommer les tables, les champs et les variables avec des noms qui ont du sens.
En gardant cela à l’esprit, vous pouvez faire une requête jointe de la galley table avec la même table dont nous récupérons déjà le contenu , que j’appellerai maintenant pages.

$sql = "SELECT 
  p.id
, p.parent_id
, p.title
, p.content
, g.id AS 'gallery_id' 
, g.image 
, g.caption 
FROM pages p 
	LEFT JOIN gallery g 
		ON g.page_id = p.id";

Après avoir ajouté quelques images au gallery table et en imprimant le résultat de la requête, nous pouvons voir les informations sur l’image et la légende.

Array
(
    [id] => 1
    [parent_id] => 0
    Find last child in recursive function - PHP - SitePoint Forums => Parent No.1
    [content] => Content for Parent No.1
    [gallery_id] => 1
    [image] => image1.jpg
     => image1 caption
)

Array
(
    [id] => 1
    [parent_id] => 0
    Find last child in recursive function - PHP - SitePoint Forums => Parent No.1
    [content] => Content for Parent No.1
    [gallery_id] => 2
    [image] => image2.jpg
     => image2 caption
)

Maintenant, dans notre version précédente, nous avons défini le categories tableau comme celui-ci plaçant le id comme tableau KEY.

$categoryMulti['categories'][$row['id']] = $row;

car les deux enregistrements de résultats de requête (illustrés ci-dessus avec des images) ont le même idle deuxième enregistrement écrase le premier, ce qui n’affiche que le dernier.

Array
(
    [1] => Array
        (
            [id] => 1
            [parent_id] => 0
            Find last child in recursive function - PHP - SitePoint Forums => Parent No.1
            [content] => Content for Parent No.1
            [gallery_id] => 2
            [image] => image2.jpg
             => image2 caption
        )

L’approche la plus simple pour résoudre ce problème serait d’ajouter une nouvelle clé de tableau appelée images pour conserver les données de la galerie de pages.

$categoryMulti = array(
    'categories' => array(),
    'parent_cats' => array(),
	'displayids' => array(),
	'images' => array()
);	

Comme avant nous utiliserons la page id comme clé primaire alors le gallery_id comme clé secondaire suivie d’un gallery champ. Faites cela pour les 3 champs appelés dans la requête.

	    $categoryMulti['images'][$row['id']][$row['gallery_id']]['gallery_id'] = $row['gallery_id']; 
	    $categoryMulti['images'][$row['id']][$row['gallery_id']]['image'] = $row['image']; 
	    $categoryMulti['images'][$row['id']][$row['gallery_id']]['caption'] = $row['caption'];

Parce que toutes les pages n’auront pas d’images, nous devrions envelopper cette section de construction de tableau dans une condition IF comme celle-ci.

	if(!empty($row['gallery_id'])):
	    $categoryMulti['images'][$row['id']][$row['gallery_id']]['gallery_id'] = $row['gallery_id']; 
	    $categoryMulti['images'][$row['id']][$row['gallery_id']]['image'] = $row['image']; 
	    $categoryMulti['images'][$row['id']][$row['gallery_id']]['caption'] = $row['caption']; 
	endif;

Cela produira un tableau comme celui-ci pour toutes les pages contenant des images. En revanche, les pages qui n’ont pas d’images n’auront PAS la page id dans ce tableau.

Array
(
    [1] => Array
        (
            [1] => Array
                (
                    [gallery_id] => 1
                    [image] => image1.jpg
                     => image1 caption
                )

            [2] => Array
                (
                    [gallery_id] => 2
                    [image] => image2.jpg
                     => image2 caption
                )

        )

)

Rappelez-vous que la première clé est la page id et il est donc assez simple de vérifier si cela id existe dans le images tableau dans notre fonction récursive en utilisant

array_key_exists($cat_id,$category['images'])

exactement comment vous voulez que les images soient affichées est pour un autre sujet, mais je vais simplement appliquer votre exemple à ce que nous avions pour le contenu.

function listContentTree($parent, $category)
{
    $css_class = ($parent == 0 ? "parent" : "child");	
	
	$html="";
    if (isset($category['parent_cats'][$parent])) {
        $html .= '
    '."n"; foreach ($category['parent_cats'][$parent] as $cat_id) { if (!isset($category['parent_cats'][$cat_id]) && in_array($cat_id, $category['displayids'])) { $html .= '
  • ' . $category['categories'][$cat_id]['content']; if(array_key_exists($cat_id,$category['images'])): foreach($category['images'][$cat_id] as $img): $html .= '
    '."r"; $html .= '

    '.$img['caption'].'

    '."r"; endforeach; endif; $html .= '
  • '."r"; } else { if(in_array($cat_id, $category['displayids'])): $html .= '
  • '."r"; $html .= $category['categories'][$cat_id]['content'] . ' '."r"; if(array_key_exists($cat_id,$category['images'])): foreach($category['images'][$cat_id] as $img): $html .= '
    '.$img['caption'].''."r"; $html .= '

    '.$img['caption'].'

    '."r"; endforeach; endif; endif; $html .= listContentTree($cat_id, $category); if(in_array($cat_id, $category['displayids'])): $html .= '
  • '."r"; endif; } } $html .= '
'."n"; } return $html; }

résultant en quelque chose comme ça.

Mise à jour complète :

$categoryMulti = array(
    'categories' => array(),
    'parent_cats' => array(),
	'displayids' => array(),
	'images' => array()
);	 
 
$sql = "SELECT 
  p.id
, p.parent_id
, p.title
, p.content
, g.id AS 'gallery_id' 
, g.image 
, g.caption 
FROM pages p 
	LEFT JOIN gallery g 
		ON g.page_id = p.id";

$query = $conn->query($sql);

while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
    $categoryMulti['categories'][$row['id']] = $row; 
	if(!empty($row['gallery_id'])):
	    $categoryMulti['images'][$row['id']][$row['gallery_id']]['gallery_id'] = $row['gallery_id']; 
	    $categoryMulti['images'][$row['id']][$row['gallery_id']]['image'] = $row['image']; 
	    $categoryMulti['images'][$row['id']][$row['gallery_id']]['caption'] = $row['caption']; 
	endif; 
    $categoryMulti['parent_cats'][$row['parent_id']][$row['id']] = $row['id'];
}


foreach($categoryMulti['categories'] as $cat_id => $arr):
	if($arr['parent_id'] == 0 && !array_key_exists($cat_id,$categoryMulti['parent_cats'])):
		$categoryMulti['displayids'][] = $cat_id;
	endif; 
endforeach;	

foreach($categoryMulti['parent_cats'] as $parent => $arr):
	if(!in_array(end($arr),$categoryMulti['displayids']) && !array_key_exists(end($arr),$categoryMulti['parent_cats'])):
		$categoryMulti['displayids'][]  = end($arr);
	endif;
endforeach;	

function listContentTree($parent, $category)
{
    $css_class = ($parent == 0 ? "parent" : "child");	
	
	$html="";
    if (isset($category['parent_cats'][$parent])) {
        $html .= '
    '."n"; foreach ($category['parent_cats'][$parent] as $cat_id) { if (!isset($category['parent_cats'][$cat_id]) && in_array($cat_id, $category['displayids'])) { $html .= '
  • ' . $category['categories'][$cat_id]['content']; if(array_key_exists($cat_id,$category['images'])): foreach($category['images'][$cat_id] as $img): $html .= '
    '.$img['caption'].''."r"; $html .= '

    '.$img['caption'].'

    '."r"; endforeach; endif; $html .= '
  • '."r"; } else { if(in_array($cat_id, $category['displayids'])): $html .= '
  • '."r"; $html .= $category['categories'][$cat_id]['content'] . ' '."r"; if(array_key_exists($cat_id,$category['images'])): foreach($category['images'][$cat_id] as $img): $html .= '
    '.$img['caption'].''."r"; $html .= '

    '.$img['caption'].'

    '."r"; endforeach; endif; endif; $html .= listContentTree($cat_id, $category); if(in_array($cat_id, $category['displayids'])): $html .= '
  • '."r"; endif; } } $html .= '
'."n"; } return $html; } echo listContentTree(0, $categoryMulti);

Leave a Comment

Your email address will not be published. Required fields are marked *