JSON.parse con 2 array

di il
14 risposte

JSON.parse con 2 array

Ciao a tutti
Cercando cercando su internet non riesco né a risolvere né a capire se effettivamente si può fare

se php restituisce questo
echo json_encode($elenco);
e io lo acchiappo con questo
var id_numbers = JSON.parse(xhttp.responseText);
allora funziona

ma se php restituisce 2 array
echo json_encode(array($elenco1,$elenco2));
come li acchiappo con JSON.parse(xhttp.responseText);
in modo tale da avere 2 array da gestire in javascript??

14 Risposte

  • Re: JSON.parse con 2 array

    melixo ha scritto:


    ma se php restituisce 2 array
    echo json_encode(array($elenco1,$elenco2));
    come li acchiappo con JSON.parse(xhttp.responseText);
    in modo tale da avere 2 array da gestire in javascript??
    Due array non possono esistere, a meno che non siano contenuti in un oggetto o in un array di array; in caso contrario, il pacchetto JSON non è valido.

    Giusto per capire, qual è il formato dei dati che viene restituito da quell'istruzione json_encode()?

    Ammesso comunque che sia JSON valido e che JSON.parse() sia in grado di gestirlo, basterebbe un log sulla console o la visualizzazione della stringa in formato JSON restituita per capire automaticamente come sono stati disposti i dati e quindi come potervi accedere una volta che il "parse" è andato a buon fine.

    Ciao!
  • Re: JSON.parse con 2 array

    La pagina php creare 2 array di testo tipo questo
    $elenco1[] = $gruppo."_".$riga["nome_foto"]."_".$riga["link"];
    $elenco2[] = $gruppo."_".$riga["nome_foto"]."_".$riga["link"];

    se io faccio questo
    echo json_encode($elenco1);
    allora tutto ok
    perché poi lo acchiappo con
    var id_numbers = JSON.parse(xhttp.responseText);

    ma io vorrei che inviarli tutti e 2 insieme gli array. Li devo riunire in un solo array tipo così?
    echo json_encode(array($elenco1,$elenco2));
    e prenderli poi come con JSON.parse?

    Perché il manuale dice che può prendere solo un oggetto alla volta. Quindi li riunisco in un solo array e ok...
    ma come li acchiappo poi e li suddivido?
    perché poi in javascript la risposta mi deve separare i 2 array e poterli gestire separatamente

    perché io trovo informazioni solo su come gestire un array multidimensionale, ma il mio non è multidimensionale, sono 2 array separati

    cioè... sì... se faccio
    echo json_encode(array($elenco1,$elenco2));
    in realtà è multidimensionale...
    Grazie Alka
  • Re: JSON.parse con 2 array

    melixo ha scritto:


    ma io vorrei che inviarli tutti e 2 insieme gli array. Li devo riunire in un solo array tipo così?
    echo json_encode(array($elenco1,$elenco2));
    e prenderli poi come con JSON.parse?
    Hai provato? In caso negativo, perché non provi e vedi?

    melixo ha scritto:


    Perché il manuale dice che può prendere solo un oggetto alla volta. Quindi li riunisco in un solo array e ok...
    ma come li acchiappo poi e li suddivido?
    perché poi in javascript la risposta mi deve separare i 2 array e poterli gestire separatamente
    Se unisci due array in un unico array, otterrai un "array di array", ovvero un array con due elementi: il primo elemento è il primo array, il secondo elemento è il secondo array.

    melixo ha scritto:


    perché io trovo informazioni solo su come gestire un array multidimensionale, ma il mio non è multidimensionale, sono 2 array separati
    Non vedo la difficoltà. Quando farai il parsing, usando l'indice appropriato sceglierai prima l'array, e aggiungendo un altro indice l'elemento all'interno di quell'array:
    
    // ...
    let allData = JSON.parse(xhttp.responseText);
    let array1 = allData[0];
    let array2 = allData[1];
    // ...
    let value1a = array1[0];
    let value1b = array1[1];
    let value2a = array2[0];
    // ...
    value1a === allData[0][0];
    value1b === allData[0][1];
    value2a === allData[1][0];
    // ...
    
    Ciao!
  • Re: JSON.parse con 2 array

    Grazie Alka, mi hai salvato il sistema nervoso già un po' compromesso...
    Lo so, sono scarso, però studio tanto, passo quasi tutto il giorno studiando, anche perché sto scrivendo un programma troppo complesso per me ma piano piano lo sto facendo. Ci sono 1 anno e mezzo dietro
  • Re: JSON.parse con 2 array

    melixo ha scritto:


    Lo so, sono scarso [...]
    No, secondo me devi essere più fiducioso: prova, sperimenta, sbaglia, impara, vinci!
  • Re: JSON.parse con 2 array

    Si, è quello che faccio sempre, però è la verità, non sono molto bravo, anche se credo di aver creato più di quanto le mie capacità lo consentissero, tant'è che infatti sono molto lento nello svilupparle.
    Una persona esperta, quello ho fatto io sino ad ora in un anno e mezzo, lo avrebbe fatto in una settimana. E mi avevano proposto di farlo per 600 euro. In una settimana lo avrei avuto pronto. E invece mi sono puntato che volevo imparare io.
    E poi cambio continuamente nei progetti, perché man mano che imparo cose nuove rivoluziono tutto ciò che ho scritto quasi da capo, mentre una persona esperta lo scriverebbe da subito al meglio.
    Più si è esperti e più si ha una visione ampia di come sviluppare le cose.
    Il mio post su quel codice da snellire ne è un esempio.
    Magari io arrivo al risultato che voglio ottenere, ma avendo meno conoscenze ci arrivo in modo molto più complesso.
  • Re: JSON.parse con 2 array

    melixo ha scritto:


    E poi cambio continuamente nei progetti, perché man mano che imparo cose nuove rivoluziono tutto ciò che ho scritto quasi da capo, mentre una persona esperta lo scriverebbe da subito al meglio.
    E' cosi per tutti, esperti e non
    Si parte da una base e poi si ottimizza strada facendo, l'importante è non arrendersi MAI davanti alle difficoltà
  • Re: JSON.parse con 2 array

    Echo json_encode($data);
    restituisce questo
    {"completi":{"1":["DSC_8857.JPG__http","DSC_8858.JPG__http","DSC_8859.JPG__http"]},"incompleti":{"2":["DSC_8861.JPG__Error","DSC_8862.JPG__Error"],"4":["DSC_8876.JPG__Error"]}}

    ed è giusto

    poi lo acchiappo con questo
    var id_numbers = JSON.parse(xhttp.responseText);

    non riesco a ciclarlo con il foreach
    id_numbers.completi.forEach(element => lab(element, upload));
    (e poi il foreach aspetta sempre una risposta da lab per ogni elemento? oppure è asincrono?)

    eppure alert(id_numbers.completi[1]); funziona

    Il problema è che non ci sono gli indici in ordine?
    Perché completi[1] 1 è il numero del gruppo che mi serve
  • Re: JSON.parse con 2 array

    melixo ha scritto:


    non riesco a ciclarlo con il foreach
    id_numbers.completi.forEach(element => lab(element, upload));
    (e poi il foreach aspetta sempre una risposta da lab per ogni elemento? oppure è asincrono?)
    Esamina bene il pacchetto JSON quando restituito dal server, magari formattandolo meglio, così hai una idea più chiara della sua struttura:
    
    {
        "completi": {
            "1": [
                "DSC_8857.JPG__http",
                "DSC_8858.JPG__http",
                "DSC_8859.JPG__http"
            ]
        },
        "incompleti": {
            "2": [
                "DSC_8861.JPG__Error",
                "DSC_8862.JPG__Error"
            ],
            "4": [
                "DSC_8876.JPG__Error"
            ]
        }
    }
    
    Il valore della proprietà "completi" è un oggetto, perché inizia con "{", mentre l'array è presente nella proprietà "1" di quell'oggetto, quindi devi ciclare su quello, al massimo:
    
    id_numbers.completi["1"].forEach(...);
    
    Non ho idea di cosa tu debba fare su queste strutture, ma le istruzioni che scrivi devono essere congrue al tipo di dato con cui hai a che fare, in base alla struttura che hai restituito lato server e che vedi sopra.

    Ciao!
  • Re: JSON.parse con 2 array


    id_numbers.completi["1"].forEach(element => lab(element, upload));
    l'avevo provato e funziona, ma non è questo ciò in cui non riesco
    io non lo so a prescindere cosa ci può essere al posto di "1"
    per quello non riesco a ciclare id_numbers.completi
    perché ciclando id_numbers.completi
    avrei un elenco di numeri e da quell'elenco potrei fare
    id_numbers.completi[X].forEach(element => lab(element, upload));

    anzi, dovrei ciclare prima l'intero array (solo che anche id_numbers non si fa ciclare)
    e mi usciranno 2 elementi (completi e incompleti)
    poi ciclare completi e mi uscirà 1 elemento ("1")
    e questo elemento ciclarlo per ottenere i 3 valori

    stessa cosa per incompleti

    so che id_numbers avrà
    id_numbers.completi
    id_numbers.incompleti
    ma non so che ["X"] avrà id_numbers.completi
    è X che non riesco a ottenere

    sto cercando di capire attraverso questa pagina se è possibile farlo
    https://www.w3schools.com/js/js_json_arrays.as
    o forse questa è più appropriata
    https://www.w3schools.com/js/js_json_objects.as
    solo che propone dei for invece che dei foreach annidati, ma forse è quasi uguale...
    l'importante per me è ottenere cosa c'è al posto di ["1"], perché può essere qualsiasi altro numero

    l'array da dove proviene è questo
    $sql = mysqli_query($mysqli_connection, "SELECT gruppo, nome_foto, link, if(link LIKE 'http%', 1, 0) as completi, if(link LIKE 'Error%', 1, 0) as incompleti FROM foto WHERE categoria = '$CATEGORIA' AND cartella_locale = '$DATA' AND link IS NOT NULL ORDER BY link DESC");
    while($riga = mysqli_fetch_assoc($sql)){
    	if($riga['completi']){
    		$data['completi'][$riga['gruppo']][] = $riga['nome_foto']."__".$riga['link'];
    	}
    	if($riga['incompleti']){
    		$data['incompleti'][$riga['gruppo']][] = $riga['nome_foto']."__".$riga['link'];
    		
    		if(array_key_exists($riga['gruppo'], $data['completi'])){
    			unset($data['completi'][$riga['gruppo']]);
    		}
    	}
    }
    
    echo json_encode($data);
    
    che mi produce questo
    Array
    (
        [completi] => Array
            (
                [1] => Array
                    (
                        [0] => DSC_8857.JPG__http
                        [1] => DSC_8858.JPG__http
                        [2] => DSC_8859.JPG__http
                    )
    
            )
    
        [incompleti] => Array
            (
                [2] => Array
                    (
                        [0] => DSC_8861.JPG__Error
                        [1] => DSC_8862.JPG__Error
                    )
    
                [4] => Array
                    (
                        [0] => DSC_8876.JPG__Error
                    )
    
            )
    
    )
    e in javascript dovrei ciclare l'array completi e l'array incompleti, separatamente
    quanti elementi ha completi?
    ma completi.lenght non funziona perché è un oggetto
    e allora come faccio a ottenere il nome del oggetto e cioè ["1"]?

    in teoria dovrei fare questo ma ovviamente non è così
    	for(var i = 0; i < id_numbers.completi.length; i++) {
    		var gruppo = id_numbers.completi[i];
    		for(var x = 0; x < id_numbers.completi[i].length; x++){
    			alert(id_numbers.completi[i][x])
    		}
    	}
    
  • Re: JSON.parse con 2 array

    L'ho trovato
    alert(Object.keys(id_numbers));
    mi dà completi e incompleti

    leggendo
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
    un po' ad intuito ma l'ho trovata
    adesso vedo se riesco a continuare
  • Re: JSON.parse con 2 array

    melixo ha scritto:


    io non lo so a prescindere cosa ci può essere al posto di "1"
    per quello non riesco a ciclare id_numbers.completi
    Non essendo un array, non puoi iterarlo come tale, ma essendo invece un oggetto con proprietà, devi trovare il modo di iterare le proprietà dell'oggetto (a meno che tu non decida di tramutarlo in un array).

    In questa pagina trovi qualche esempio di come fare.

    La stessa cosa varrà ovviamente per tutti gli scenari affini.
  • Re: JSON.parse con 2 array

    Qualche critica??
    Funziona perfettamente ma chissà... magari lo sapreste migliorare
    Io ci ho messo 2 giorni a scrivere solo questo...


    function attivazione_upload(){
    	if(document.getElementById('status_invio_foto').textContent == "Attiva Upload Foto"){
    		document.getElementById('status_invio_foto').textContent = "Disattiva Upload Foto";
    		timer_upload = setInterval(check_upload_foto, 5000);
    	}else{
    		document.getElementById('status_invio_foto').textContent = "Attiva Upload Foto";
    		clearInterval(timer_upload);
    	}
    }
    function check_upload_foto(gruppo = false){
    		var	url = "upload.php?check_upload=&categoria="+cartella+"&data="+data;
    		var xhttp = new XMLHttpRequest();
    		xhttp.onreadystatechange = function()
    			{
    				if(this.readyState == 4 && this.status == 200) 
    					{
    						result_check_upload(xhttp);
    					}
    			};
    		xhttp.open("GET", url, true);
    		xhttp.send();
    }
    
    if(isset($_GET["check_upload"])){
    	$CATEGORIA = $_GET["categoria"];
    	$DATA = $_GET["data"];
    	if(isset($_GET["gruppo"])){
    		$GRUPPO = $_GET["gruppo"];
    	}
    }
    
    //////// LA PAGINA UPLOAD.PHP
    $sql = mysqli_query($mysqli_connection, "SELECT gruppo, nome_foto, link, if(link LIKE 'http%', 1, 0) as completi, if(link LIKE 'Error%', 1, 0) as incompleti FROM foto WHERE categoria = '$CATEGORIA' AND cartella_locale = '$DATA' AND link IS NOT NULL ORDER BY link DESC");
    while($riga = mysqli_fetch_assoc($sql)){
    	if($riga['completi']){
    		$data['completi'][$riga['gruppo']][] = $riga['nome_foto']."__".$riga['link'];
    	}
    	if($riga['incompleti']){
    		$data['incompleti'][$riga['gruppo']][] = $riga['nome_foto']."__".$riga['link'];
    		
    		if(array_key_exists($riga['gruppo'], $data['completi'])){
    			unset($data['completi'][$riga['gruppo']]);
    		}
    	}
    }
    
    echo json_encode($data);
    ////////  RESTITUISCE A JAVASCRIPT
    
    
    
    
    function result_check_upload(xhttp){
    	var upload = document.getElementsByClassName("esito_upload");
    	var id_numbers = JSON.parse(xhttp.responseText);
    	var elenco_gruppi_completi = Object.keys(id_numbers.completi);
    	var elenco_gruppi_incompleti = Object.keys(id_numbers.incompleti);
    
    	for(var x = 0; x < elenco_gruppi_completi.length; x++){
    		for(var y = 0; y < id_numbers.completi[elenco_gruppi_completi[x]].length; y++){
    			upload[elenco_gruppi_completi[x]-1].src = "ok.png";
    			upload[elenco_gruppi_completi[x]-1].title = "Upload Completo";
    			//	RESET CLASS IMAGE BORDER
    			var el = elenco_gruppi_completi[x];
    			var imgtag = document.querySelectorAll('img[name="'+el+'"]');
    			for(var z=0;z<imgtag.length;z++)
    			if(imgtag[z].getAttribute("class")){
    				imgtag[z].removeAttribute("class", "imageborder_to_upload_FAILURE");
    			}
    		}
    	}
    	for(var x = 0; x < elenco_gruppi_incompleti.length; x++){
    			//	RESET CLASS IMAGE BORDER
    			var el = elenco_gruppi_incompleti[x];
    			var imgtag = document.querySelectorAll('img[name="'+el+'"]');
    			for(var z=0;z<imgtag.length;z++)
    			if(imgtag[z].getAttribute("class")){
    				imgtag[z].removeAttribute("class", "imageborder_to_upload_FAILURE");
    			}
    		for(var y = 0; y < id_numbers.incompleti[elenco_gruppi_incompleti[x]].length; y++){
    			upload[elenco_gruppi_incompleti[x]-1].src = "interr.png";
    			upload[elenco_gruppi_incompleti[x]-1].title = "Upload PARZIALE";
    			var nome_foto = id_numbers.incompleti[elenco_gruppi_incompleti[x]][y];
    			var split_ = nome_foto.split("__");
    			document.getElementById("../CATALOGO/"+cartella+"/"+data+"/"+split_[0]).setAttribute("class", "imageborder_to_upload_FAILURE");
    			document.getElementById("../CATALOGO/"+cartella+"/"+data+"/"+split_[0]).setAttribute("title", split_[1]);
    		}
    	}
    }
    
  • Re: JSON.parse con 2 array

    melixo ha scritto:


    Funziona perfettamente ma chissà... magari lo sapreste migliorare
    Può darsi, ma in assenza di un problema specifico, mettersi ad analizzare un codice lungo senza avere tutti i dettagli di contorno e quindi senza sapere con che grado di sicurezza si potrebbe fattorizzare, fatto salvo qualche caso specifico, diventa tedioso e richiede tempo.
Devi accedere o registrarti per scrivere nel forum
14 risposte