Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    3

    PHP - Creare cicli Foreach innestati tra loro quanti sono gli elementi di un array

    Salve, sto cercando una soluzione a questo problema, vi porto un esempio:

    Questo è il mio array di partenza:

    codice:
    print_r($container);
    
    Array
    (
        [list1] => Array
            (
                [0] => Array
                    (
                        [id_topic] => 45
                        [id_topicGroup] => 44
                        [topic] => topic1 di 44
                    )
    
                [1] => Array
                    (
                        [id_topic] => 46
                        [id_topicGroup] => 44
                        [topic] => topic2 di 44
                    )
    
                [2] => Array
                    (
                        [id_topic] => 47
                        [id_topicGroup] => 44
                        [topic] => topic3 di 44
                    )
    
            )
    
        [list2] => Array
            (
                [0] => Array
                    (
                        [id_topic] => 48
                        [id_topicGroup] => 45
                        [topic] => topic1 di 45
                    )
    
                [1] => Array
                    (
                        [id_topic] => 49
                        [id_topicGroup] => 45
                        [topic] => topic2 di 45
                    )
    
                [2] => Array
                    (
                        [id_topic] => 50
                        [id_topicGroup] => 45
                        [topic] => topic3 di 45
                    )
    
            )
    
    )
    Questa è l'elaborazione che faccio per questo specifico caso, in cui ho solo due liste presenti, esempio:

    codice:
    foreach($container)['list1'] as $el_lista1) {
                    foreach($container)['list2'] as $el_lista2) {
                        echo $el_lista1 . " " . $el_lista2 . "<br>\n";
                    }                
                }
    Ed questo e l'output desiderato di stampa che ottengo:

    codice:
    topic1 di 44 topic1 di 45
    
    topic1 di 44 topic2 di 45
    
    topic1 di 44 topic3 di 45
    
    topic2 di 44 topic1 di 45
    
    topic2 di 44 topic2 di 45
    
    topic2 di 44 topic3 di 45
    
    topic3 di 44 topic1 di 45
    
    topic3 di 44 topic2 di 45
    
    topic3 di 44 topic3 di 45
    Il problema si pone quando devo gestire un numero indefinito di elementi presenti nell'array $container tramite dei cicli foreach innestati tra loro (come nell'esempio di elaborazione riportato precedentemente per gestire 2 elementi), in quanto mi servirebbero che i cicli innestati siano uguali al numero di elementi presenti nell'array.

    Come si può fare?

    Grazie per ogni suggerimento!

  2. #2
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Mai sentito parlare di ricorsione?

    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    3
    Quote Originariamente inviata da Grino Visualizza il messaggio
    Mai sentito parlare di ricorsione?

    Certo! Infatti so che è una possibile soluzione al mio problema e tra l'altro l'avevo aggiunta come tag a questo post, soltanto che non l'ho mai utilizzata quindi se potresti farmi un esempio di una sua applicazione per risolvere questo problema te ne sarei grato !

  4. #4
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Non posso farti un esempio partendo dal tuo codice che è errato e non può mai produrre l'output che indichi anche perchè $el_lissta1 e 2 contengono un array. Però, leggendo le combinazioni "topicX topicY" mi sembra di capire che vuoi produrre tutte le disposizioni senza ripetizione partendo da un array che al suo inteno comprende delle liste di valori o qulacosa del genere.

    A scopo esemplificativo ti posto il seguente codice:

    Codice PHP:
    <?php

    $data 
    = Array(
        
    => Array(
            
    => 45,
            
    => 46,
            
    => 47),
        
    => Array(
            
    => 48,
            
    => 49,
            
    => 50),
        
    => Array(
            
    => 51,
            
    => 52,
            
    => 53),
        
    => Array(
            
    => 54,
            
    => 55,
            
    => 56)
    );

    function 
    calcola(&$array, &$testo) {
        static 
    $stack = array(), $profondita 0;
        if (isset(
    $array[$profondita])) {
            foreach (
    $array[$profondita] as $value) {
                
    array_push($stack$value);
                
    $profondita++;
                
    calcola($array$testo);
                
    $profondita--;
                
    array_pop($stack);
            }
        } else {
            if (!empty(
    $stack)) {
                foreach (
    $stack as $value)
                    
    $testo .= $value '-';
                
    $testo substr($testo0strlen($testo) - 1) . '<br>';
            }
        }
    }

    calcola($data$testo);
    echo 
    $testo;
    ?>
    che produce il seguente output:
    codice:
    45-48-51-54
    45-48-51-55
    45-48-51-56
    45-48-52-54
    45-48-52-55
    45-48-52-56
    45-48-53-54
    45-48-53-55
    45-48-53-56
    45-49-51-54
    45-49-51-55
    45-49-51-56
    45-49-52-54
    45-49-52-55
    45-49-52-56
    45-49-53-54
    45-49-53-55
    45-49-53-56
    45-50-51-54
    45-50-51-55
    45-50-51-56
    45-50-52-54
    45-50-52-55
    45-50-52-56
    45-50-53-54
    45-50-53-55
    45-50-53-56
    46-48-51-54
    46-48-51-55
    46-48-51-56
    46-48-52-54
    46-48-52-55
    46-48-52-56
    46-48-53-54
    46-48-53-55
    46-48-53-56
    46-49-51-54
    46-49-51-55
    46-49-51-56
    46-49-52-54
    46-49-52-55
    46-49-52-56
    46-49-53-54
    46-49-53-55
    46-49-53-56
    46-50-51-54
    46-50-51-55
    46-50-51-56
    46-50-52-54
    46-50-52-55
    46-50-52-56
    46-50-53-54
    46-50-53-55
    46-50-53-56
    47-48-51-54
    47-48-51-55
    47-48-51-56
    47-48-52-54
    47-48-52-55
    47-48-52-56
    47-48-53-54
    47-48-53-55
    47-48-53-56
    47-49-51-54
    47-49-51-55
    47-49-51-56
    47-49-52-54
    47-49-52-55
    47-49-52-56
    47-49-53-54
    47-49-53-55
    47-49-53-56
    47-50-51-54
    47-50-51-55
    47-50-51-56
    47-50-52-54
    47-50-52-55
    47-50-52-56
    47-50-53-54
    47-50-53-55
    47-50-53-56
    La ricorsività permette di annidare i foreach indipendentemente dal numero di liste, lo stack serve a memorizzare i valori che compongono la tupla e a recuperarli nel momento in cui si raggiunge la profondità massima (ossia è stato estratto un valore da ogni lista) per ripartire con la tupla successiva.

    Questo è un metodo ricorsivo. Ovviamente può essere riprodotto anche in modo iterativo.



    Edit: Ho visto ora che prendi in considerazione l'elemento topic per produrre la stringa. L'esempio che ti ho postato è una possibile soluzione.
    Ultima modifica di Grino; 16-05-2014 a 04:07
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    3
    Quote Originariamente inviata da Grino Visualizza il messaggio
    Non posso farti un esempio partendo dal tuo codice che è errato e non può mai produrre l'output che indichi anche perchè $el_lissta1 e 2 contengono un array. Però, leggendo le combinazioni "topicX topicY" mi sembra di capire che vuoi produrre tutte le disposizioni senza ripetizione partendo da un array che al suo inteno comprende delle liste di valori o qulacosa del genere.

    A scopo esemplificativo ti posto il seguente codice:

    Codice PHP:
    <?php

    $data 
    = Array(
        
    => Array(
            
    => 45,
            
    => 46,
            
    => 47),
        
    => Array(
            
    => 48,
            
    => 49,
            
    => 50),
        
    => Array(
            
    => 51,
            
    => 52,
            
    => 53),
        
    => Array(
            
    => 54,
            
    => 55,
            
    => 56)
    );

    function 
    calcola(&$array, &$testo) {
        static 
    $stack = array(), $profondita 0;
        if (isset(
    $array[$profondita])) {
            foreach (
    $array[$profondita] as $value) {
                
    array_push($stack$value);
                
    $profondita++;
                
    calcola($array$testo);
                
    $profondita--;
                
    array_pop($stack);
            }
        } else {
            if (!empty(
    $stack)) {
                foreach (
    $stack as $value)
                    
    $testo .= $value '-';
                
    $testo substr($testo0strlen($testo) - 1) . '<br>';
            }
        }
    }

    calcola($data$testo);
    echo 
    $testo;
    ?>
    che produce il seguente output:
    codice:
    45-48-51-54
    45-48-51-55
    45-48-51-56
    45-48-52-54
    45-48-52-55
    45-48-52-56
    45-48-53-54
    45-48-53-55
    45-48-53-56
    45-49-51-54
    45-49-51-55
    45-49-51-56
    45-49-52-54
    45-49-52-55
    45-49-52-56
    45-49-53-54
    45-49-53-55
    45-49-53-56
    45-50-51-54
    45-50-51-55
    45-50-51-56
    45-50-52-54
    45-50-52-55
    45-50-52-56
    45-50-53-54
    45-50-53-55
    45-50-53-56
    46-48-51-54
    46-48-51-55
    46-48-51-56
    46-48-52-54
    46-48-52-55
    46-48-52-56
    46-48-53-54
    46-48-53-55
    46-48-53-56
    46-49-51-54
    46-49-51-55
    46-49-51-56
    46-49-52-54
    46-49-52-55
    46-49-52-56
    46-49-53-54
    46-49-53-55
    46-49-53-56
    46-50-51-54
    46-50-51-55
    46-50-51-56
    46-50-52-54
    46-50-52-55
    46-50-52-56
    46-50-53-54
    46-50-53-55
    46-50-53-56
    47-48-51-54
    47-48-51-55
    47-48-51-56
    47-48-52-54
    47-48-52-55
    47-48-52-56
    47-48-53-54
    47-48-53-55
    47-48-53-56
    47-49-51-54
    47-49-51-55
    47-49-51-56
    47-49-52-54
    47-49-52-55
    47-49-52-56
    47-49-53-54
    47-49-53-55
    47-49-53-56
    47-50-51-54
    47-50-51-55
    47-50-51-56
    47-50-52-54
    47-50-52-55
    47-50-52-56
    47-50-53-54
    47-50-53-55
    47-50-53-56
    La ricorsività permette di annidare i foreach indipendentemente dal numero di liste, lo stack serve a memorizzare i valori che compongono la tupla e a recuperarli nel momento in cui si raggiunge la profondità massima (ossia è stato estratto un valore da ogni lista) per ripartire con la tupla successiva.

    Questo è un metodo ricorsivo. Ovviamente può essere riprodotto anche in modo iterativo.



    Edit: Ho visto ora che prendi in considerazione l'elemento topic per produrre la stringa. L'esempio che ti ho postato è una possibile soluzione.
    OK, grazie mille per l'esempio ho risolto!

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.