Un ciclo Foreach dentro un array.

di il
8 risposte

Un ciclo Foreach dentro un array.

Ciao Ragazzi, 
Ho ancora bisogno di scambiare un opinione ed un vs. suggerimento.
devo creare una JSON da alcuni records, ho completato la maggior parte di questa procedura ma ho un problema in un passaggio.

In pratica devo far ciclare tante volte per quante immagini sono state inserite. Il difficile ( per me ) è inserire questo ciclo dentro la creazione dell'array. Per come l'ho scritta io mi dà errori.
In pratica ho questo codice : 

$parte2[] = array(    
        
        "customerProperties" => array(
            array(
               "propertyCode" => $value['id'],
               "propertyReference" => $codice,
               "propertyImages" => array(
                            array(
                                "imageOrder" => 1,
                                "imageLabel" => "bathroom",
                                "imageUrl" => "http://www.sito.it/foto/photo1.jpg"
                            ),
                            array(
                                "imageOrder" => 2,
                                "imageLabel" => "camera",
                                "imageUrl" => "http://www.sito.it/foto/photo2.jpg"
                            ),
                            array(
                                "imageOrder" => 3,
                                "imageLabel" => "Sala",
                                "imageUrl" => "http://www.sito.it/foto/photo3.jpg"
                            ),
                            array(
                                "imageOrder" => 4,
                                "imageLabel" => "Cucina",
                                "imageUrl" => "http://www.sito.it/foto/photo4.jpg"
                            ),
                 )
            )
        )
    );

All'inizio ho la creazione di $parte1, che contiene la testa del JSON, poi con un array_merge() lo unisco , il mio problema è qui' non so come far ciclare dal DB per le immagini.
Potete darmi una mano?
Nel frattempo continuo a provarci. 
grazie.

8 Risposte

  • Re: Un ciclo Foreach dentro un array.

    Il foreach si usa per scorrere array o oggetto, mentre la variabile per assegnazione “=” è scrivere. Il testo del messaggio che dà errore lo conferma.

    Scusa puoi spiegare in maniera differente cosa devi fare?

  • Re: Un ciclo Foreach dentro un array.

    Ciao Hormus, grazie per l'attenzione, la creazione di questo array ha un sacco di informazioni, è molto lungo ho estratto solo la parte che mi crea problemi, cioè quella che deve ciclare, cerco di spiegarmi meglio.  Da una tabella devo creare quest'array che poi usero' per costruire un JSON, richiesto con queste modalità.  Prelevo dalla tabella immagini tutte le foto caricate legate ad un immobile 

    $dati   = estrai_foto($codice);
       
    foreach ($dati as $value) {
             $img   = $value['drv_foto']; 
             $testo = $value['testo']; 
             $seq   = $value['seq'];
             
             // in teoria dovrei creare qui l'array del dettaglio
     }
     
     // ********
     function estrai_foto($codice){
    	    $mysqli = $GLOBALS['mysqli'];
            $records = [];
              
            $sql =  "SELECT * FROM immagini where flag=1 order by codice ASC" ;
             
            $result = $mysqli->query($sql);
           
            if($result && $result->num_rows){
                while (  $row =  $result->fetch_assoc()  ) {
                     $records[] = $row;
     
                } 
             }
            
            return $records;
     }

    Ovviamente non conosco la quantità di foto registrate quindi, per creare l'array richiesto dovrei inserirlo dentro il foreach ma non mi consente di farlo. Non so perchè, alla fine devo ricomporre gli array  con array_merge  ( testa, dettaglio e coda ) prima di creare il Json.

  • Re: Un ciclo Foreach dentro un array.

    Quel $dati è una matrice a più dimensioni, count($dati) ti da quanti elementi ci sono e se la SQL d'estrazione estrae le img con flag 1.

    Quindi avrai $dati[0], $dati[1], $dati[2] per quante ne ricava la matrice $records a più dimensioni della funzione estrai_foto

  • Re: Un ciclo Foreach dentro un array.

    $dati è il risultato della funzione esterna allo script, il return della chiamata 

    $dati   = estrai_foto($codice);
    foreach ($dati as $value) {
             $img   = $value['drv_foto']; 
             $testo = $value['testo']; 
             $seq   = $value['seq'];
     }   

      ma questo ti assicuro che non ha problemi, uso sempre questo metodo e funziona , il problema è la scrittura dell'array : 

    "customerProperties" => array(
                array(
                   "propertyCode" => $value['id'],
                   "propertyReference" => $codice,
                   "propertyImages" => array(
                   				//	io dovrei ciclare con foreach  da qui 
                                array(
                                    "imageOrder" => $seq,
                                    "imageLabel" => $testo,
                                    "imageUrl"   => $img
                                ),
                                
                    			// fine ciclo 

    ma potrei usare anche  array_push per inserire ogni record all'array creato ? 
    Non saprei proprio come , devo ragionarci su, mi serviva un'aiuto per questo motivo.

  • Re: Un ciclo Foreach dentro un array.

    Ciclare cosa? Guardi questa sintassi var_dump(array(array('valore'))); //è una scorciatoia, mentre la sintassi completa equivalente è array(0 => array(0 => ‘valore’));

    Cioè crea array a più dimensioni solo con indice 0.

    <?php
    $arr = array(array('imageOrder' => 'valore1', 'imageOrder' => 'valore2'));
    var_dump($arr);
    /* risultato atteso
    array(1) {
      [0]=>
      array(1) {
        ["imageOrder"]=>
        string(7) "valore2"
      }
    }
    */
  • Re: Un ciclo Foreach dentro un array.

    Salve a tutti, mi devo scusare per il lungo periodo di assenza dovuto a problemi di salute.
    Ho visto le vs. risposte, vi ringrazio per l'attenzione. 
    Il problema non è risolto, ho potuto fare ben poco, giusto ieri ero nuovamente al pc.
    Questo sarà lungo ma per farvi capire meglio come ho modificato devo scrivere tutto.
    Quello che devo riuscire a risolvere è un problema per me difficile.
    In pratica devo costruire un nodo che deve risultare dentro un'altro nodo.
    Il nodo $customer[] contiene informazioni dell' immobile del tipo : Indirizzo, localita, dimensioni, prezzo etc…

     $customer = array( 
                    "customerProperties" =>  array ( 
                        array(
                            "propertyCode"       => $id,
                            "propertyReference"  => $immobile, 
                            "propertyVisibility" => $propertyVisibility,
                            "propertyOperation"  => array( 
                                "operationType"  => $operationType,
                                "operationPrice" => $operationPrice,
                                "operationPriceCommunity" => $operationPriceCommunity,
                                "operationPriceParking"   => 1
                ),
                    "propertyContact" => array(
                        "contactName" => $agente_nome,
                        "contactEmail" => $agente_email,
                        "contactPrimaryPhonePrefix" => "39",
                        "contactPrimaryPhoneNumber" => $agente_phone,
                ),
                    "propertyAddress" => array(
                        "addressVisibility" => $addressVisibility,
                        "addressStreetName" => $addressStreetName,
                        "addressStreetNumber" => $addressStreetNumber,
                        "addressFloor" => $addressFloor,
                        "addressPostalCode" => $addressPostalCode,
                        "addressTown"    => $addressTown,
                        "addressCountry" => $addressCountry,
                        "addressCoordinatesPrecision" => "exact",
                        "addressCoordinatesLatitude"  => $lat,
                        "addressCoordinatesLongitude" => $lng
                ),
                    "propertyFeatures" =>  array(
                        "featuresType"            => $featuresType,
                        "featuresAreaConstructed" => $featuresAreaConstructed ,
                        "featuresAreaUsable"      => $featuresAreaUsable ,
                        "featuresBathroomNumber"  => $featuresBathroomNumber,
                        "featuresBedroomNumber"   => $featuresBedroomNumber,
                        "featuresBuiltYear"       => $featuresBuiltYear,
                        "featuresConditionedAir"  => $featuresConditionedAir,
                        "featuresConservation"    => $featuresConservation,
                        "featuresDoorman"         => $featuresDoorman,
                        "featuresEnergyCertificateRating" => $featuresEnergyCertificateRating,
                        "featuresGarden"          => $giardino,
                        "featuresPool"            => $piscina,
                        "featuresRooms"           => $featuresBedroomNumber,
                        "featuresStorage"         => false,
                        "featuresStudio"          => false,
                        "featuresTerrace"         => $terrazza,
                        "featuresWardrobes"       => false,
                        "featuresParkingAvailable" => $garage,
                        "featuresHeatingType"      => $riscaldamento
                ),
                    "propertyDescriptions" => array( 
                      array(  "descriptionLanguage" => "italian",
                        "descriptionText" => "italian description"
                        )
                    ),
                ),
            ),           
        );  //      customerProperty 

    Fino a qui non ci sono problemi ma, proseguendo devo leggere la tabella immagini che contiene per ogni immobile tutte le foto caricate.  Ovviamente per ciclare questa tabella ho dovuto chiudere la creazione dell'array $customer. Qui avrò questo passaggio : 

    $foto = get_foto($immobile);	// dalla funzione leggo tutte le foto con codice = $immobile.
      
        $conta++;
        
        $num_foto =count($foto);           
        $cnt=0;
        
        foreach ($foto as $img) {
            
            $propertyImages[$cnt] = array(
                "imageOrder" => $img['seq'],
                "imageLabel" => $img['title'],
                "imageUrl" => 'http://www.sitonline.it/'.$img['drv_foto'].'/'.$img['foto']
            );
    
            $propertyVideos[] = array (
                "propertyVideos" => $cnt,  
                "videoUrl" => 'http://www.sitonline.it/'.$img['drv_foto'].'/'.$img['video1']
            );
            
              $cnt ++;
        }
        
        $images = [
            "propertyImages" => $propertyImages
        ];
    

    ora ho due array e devo poter inserire  $images al nodo principale $customer ma nonostante diverse prove non riesco ad agganciarli, ho provato anche cosi :

       array_push($customer, $images);
        
       array_merge($customer, $images);  

    non ottengo il risultato che mi serve, come posso agganciare l'array $images al nodo $customer ? 
    Mi potete spiegare come potrei fare? 
    grazie.

  • Re: Un ciclo Foreach dentro un array.

    Adesso ho provato a modificare il ciclo foreach in questo modo : 

      foreach ($foto as $img) {
          $images[$cnt] = array(
               "imageOrder" => $img['seq'],
               "imageLabel" => $img['title'],
               "imageUrl" => 'http://www.sitonline.it/'.$img['drv_foto'].'/'.$img['foto']
           );
            
            // Ho messo il push dell'array in questa posizione
          	 array_push($customer, $images[$cnt]);    
            
             $cnt ++;
       }

    anche se mi sembrava logico cercare di “attaccarlo” al nodo $customer in realtà fatto cosi' nel json mi stampa prima l'array $images e poi quello $customer, ma comunque slegato uno dall'altro…

  • Re: Un ciclo Foreach dentro un array.

    Ho risolto, 
    capisco che si trattava di un problema un pò particolare e forse poco usato,   pochi interventi in mio aiuto ma  posso capire.

    Se vi servisse la soluzione vi posto il codice.

    ho Il primo $customer che contiene i dati di intestazione dell'immobile, a questo bisogna collegare tutte le immagini, non sappiamo quante, una tabella memorizza il percorso ed il nome, la chiave è il numero di ID .

       $foto  = get_foto($immobile);        //semplice funzione che legge la tabella e memorizza i records con id=$immobile.
     
            $cnt=0;
       
       foreach ($foto as $img) {
           
           $images[$cnt] = array(
               "imageOrder" => intval($img['seq'] ),
               "imageLabel" => $img['title'],
               "imageUrl"   => 'http://www.sitonline.it/'.$img['drv_foto'].'/'.$img['foto']
           );
       
               $cnt ++;
       }
       // esco dal ciclo con un array di immagini
        
        $customer['customerProperties'][0]['propertyImages'] =  $images;     
            // aggiungo all'array $customer il nodo propertyImages con le righe interessate.
         
       $data = array_merge($testa, $customer);
    		// qui accorpo la testata e il corpo in un unico array che poi trasformo in JSON.
Devi accedere o registrarti per scrivere nel forum
8 risposte