Newsgroup: it.comp.www.php
Titolo: problemino con Array

require_once( 'gestione/hack.php' );
$hackData = getHhack($Prezzo);
$count = count($hackData);
$lastOptionID = -1;
$array_hack = '';
 
for ($index = 0; $index < $count; $index++) {
     $guestHack = $hackData[$index];
     $optionID = $guestHack->get_OptionID();
     $comma = ',';
     if ($lastOptionID != $optionID) {
            if ($lastOptionID != -1) {
                $array_hack .= "],";
                $lastOptionID = $optionID;
               $array_hack .= '"' . $optionID . '":[';
              $comma = '';
         }
     }
 
$array_hack .= $comma.'["'.$guestHack->get_Opzione().'","' 
.$guestHack->get_Hack() . '"]';
     }
 
 
il risultato che vorrei ottenere è questo:
var hack = 
{"17":[["1","1"],["2","2"],["3","3"],["4","4"],["5","5"]],"18":[["1","onesidetxt"],["2","twosidetxt"]]};
 
 
Il rusultato che ottendo dalle righe soprastanti è questo:
var hack = 
{,["1","1"],["2","2"],["3","3"],["4","4"],["5","5"],["1","onesidetxt"],["2","twosidetxt"]};
 
come ne vengo fuori?

 {"17":[["1","1"],["2","2"],["3","3"],["4","4"],["5","5"]],"18":
[["1","onesidetxt"],["2","twosidetxt"]]};
 
E` un json che devi passare a javascript?
In questo caso, attento che il "17" potrebbe diventare "17", e crearti un 
array con 17 elementi vuoti (da 0 a 16) prima dei tuoi 17 e 18.
Ti conviene usare chiavi che inizino con una stringa.
 
Se è questo che ti serve, ti basta arrivare a generare un array PHP del 
tipo
 
{"17":[["1","1"],["2","2"],["3","3"],["4","4"],["5","5"]],"18":
[["1","onesidetxt"],["2","twosidetxt"]]};
 
 
$res = array(
 "e17" => array(
  array(1,1),
  array(2,2),
  array(3,3),
  array(4,4),
  array(5,5)
 ),
 "e18" => array(
  array(1,'onesidetxt'),
  array(2,'twosidetxt')
 )
);
 
E poi fare un
 
echo json_encode($res);
 
Senza andare a farti la costruzione a mano.
PHP trasforma automaticamente gli array con chiavi "automatiche"
(numeriche che partono da 0) in array js, e quelli con chiavi "impostate 
a mano" (stringhe o numeriche che non partono da 0) in oggetti js.
 
Bye.

 [["1","onesidetxt"],["2","twosidetxt"]]};
 
Questo pezzo doveva essere quotato sopra (è il tuo codice) e non fa parte 
della risposta. A quest'ora inizio a cedere... :)
 
Bye.
 
 


I dati li estraggo da una tabella di mysql
 
tabella opzioni è cosi composta:
 
campo1    campo2    campo3
17    	   1         1
17    	   2         2
17    	   3         3
17    	   4         4
17    	   5         5
18    	   1         onesidetxt
18    	   2         twosidetxt
 
 
Il rusultato che dovrei ottenere è questo:
var hack = 
{"17":[["1","1"],["2","2"],["3","3"],["4","4"],["5","5"]],"18":[["1","onesidetxt"],["2","twosidetxt"]]};
 
ecco perche utilizzo lo script postato
 

 I dati li estraggo da una tabella di mysql
 
Pan mi scazza l'output. Il codice sarà qualcosa del genere:
 
// posto che $res sia il risultato di una select sul DB:
 
$prejson = array();
 
foreach ($res as $row) {
 
  $key = 'e'.$row['campo1'];
 
  if (!array_key_exists($key, $prejson) {
 
    $prejson[$key] = array();
 
  }
 
  $prejson[$key][] = array($row['campo2'], $row['campo3']);
 
}
 
echo json_encode($prejson);
 
 
Ho aggiunto la "e" davanti ai nomi dei campi per i motivi che ti ho 
spiegato prima.
 
Bye.


ti spiego come faccio la query..
 
 
function getHack(){
     $connection = initDB();
     $query;
	$query = "SELECT OptionID, Option, Hack  FROM options ORDER BY OptionID ";
 
	//print $query;
 
     $result = mysql_query($query) or die ("Query Failed 
".mysql_error(). print $query );
 
     $hackID = 0;
     $hackData;
 
     while($row = mysql_fetch_array($result)){
     	$OptionID = $row['OptionID'];
	$Option = $row['Option'];
	$Hack = $row['Hack'];
 
         $guestHack = new GuestHack();
 
         $guestHack->set_OptionID($OptionID);
	$guestHack->set_Opzione($Option);
	$guestHack->set_Hack($Hack);
 
         $hackData[$hackID]=$guestHack;
         $hackID = $optionhackID + 1;
      }
 
     closeDB($connection);
     return $hackData;
}
 
 
 
ecco perche ho usato FOR
secondo te mi conviene cambiare tutto e usare foreach o modificare il 
codice dentro for....?
 
 
 
 

 foreach o modificare il codice dentro for....?
 
Hai un array, quindi foreach funziona. Il mio codice lo puoi cambiare 
velocemente per usare il tuo array di oggetti invece di un array di array:
 
 
$res = getHack();
 
$prejson = array();
 
foreach ($res as $row) {
 
  $key = 'e'.$row->get_OptionID();
 
  if (!array_key_exists($key, $prejson) {
 
    $prejson[$key] = array();
 
  }
 
  $prejson[$key][] = array($row->get_Opzione(), $row->get_Hack());
 
}
 
echo json_encode($prejson);
 
 
 
Bye.


PERFETTO !!!!
 
grazie mille
 
una domanda ma con json_encode posso avere un array anche di questo tipo?
var ments = [{"ad_id":"11"},{"ad_id":"12"},{"ad_id":"13"}];
 
adesso lo ottengo cosi:
     for($index=0;$index < count($optionData);$index++){
     	$guestOption = $optionData[$index];
 
		$array_option[] = '{"ad_id":"' . $guestOption->get_OptionID() . '"},';
 
	}
 
Il problema tra virgolette che che alla fine dei record mi lascia sempre 
un comma
 
 
 

 $array_option[] = '{"ad_id":"' . $guestOption->get_OptionID() . '"},';
 
Costruirsi il json a mano è una strada sicura verso l'insanità mentale.
 
Bye.


Si è corretto come dici tu di fare a mano, ma purtroppo questi dati li 
estraggo da un database di articoli e possono aumentare come diminuire e 
gestirli di volta in volta è difficile ecco perche sto cercando di 
"automatizzare" la generazione dei valori
 
 

 "automatizzare" la generazione dei valori
 
Come ti ho detto, costruisci un array php e poi usa json_encode. E` più 
semplice, più pulito, e genera un json corretto, che non è banale.
 
Bye.


Scusami ma non ne vengo fuori
 
ipotizzando l'esempio di prima
require_once( 'gestione/hack.php' );
$hackData = getHack();
$hack = array();
foreach ($hackData as $row) {
   $key = $row->get_OptionID();
   if (!array_key_exists($key, $hack)) {
	$hack[$key] = array();
   }
   $hack[$key][] = array($row->get_Opzione(), $row->get_Hack());
}
 
 
come faccio ad avere questo risultato?
  [{"ad_id":"11"},{"ad_id":"12"},{"ad_id":"13"}]
 
ho provato e riprovato mi son letto tutto 
http://php.net/manual/en/language.types.array.php
 
 
non ne vengo fuori
Franco

   [{"ad_id":"11"},{"ad_id":"12"},{"ad_id":"13"}]
 
Se cambia il formato dei dati di partenza e quello di arrivo devi 
scrivere un codice diverso.
 
Siccome la mia politica è "dai una mano ma non dare la pappa pronta", e 
ti ho già dato sia la pappa pronta per la prima parte, sia un indizio su 
come ottenere questa seconda parte, l'unica cosa che posso scriverti 
ancora è "Studia. Poi prova e poi studia ancora. Goto 1".
 
Bye.


$IDOption = array();
foreach ($addOptionIDData as $rowOption) {
   $keyOpt = $rowOption->get_OptionID();
   $IDOption[$keyOpt] = array();
   if (!array_key_exists($keyOpt, $IDOption)) {
	$IDOption[$keyOpt] = array();
   }
   $IDOption[$keyOpty][] = array('ad_id',$rowOption->get_OptionID());
}
echo json_encode($IDOption);
 
risultato:
{"11":[],"":[["ad_id","11"],["ad_id","12"],["ad_id","13"]],"12":[],"13":[]}
 
in che riga faccio l'errore?
 
 
 
 


Modificando un po :
	$IDOption = array();
	foreach ($addOptionIDData as $rowOption) {
	  $keyOpt = $rowOption->get_OptionID();
	  $IDOption[$keyOpt] = array();
	  if (!array_key_exists($keyOpt, $IDOption)) {
		$IDOption[$keyOpt] = array();
	  }
	  $IDOption[$keyOpt] = array('ad_id'=>array($rowOption->get_OptionID()) );
	}
	echo json_encode($IDOption);
 
adesso ottengo questo:
{"11":{"ad_id":["11"]},"12":{"ad_id":["12"]},"13":{"ad_id":["13"]}}
 
 


Buon giorno Alessandro
diciamo che quasi ci sono
 
$IDOption = array();
foreach ($addOptionIDData as $rowOption) {
   $keyOpt = $rowOption->get_OptionID();
   $IDOption[$keyOpt] = array();
   if (!array_key_exists($keyOpt, $IDOption)) {
	$IDOption[$keyOpt] = array();
   }
   $IDOption[$keyOpt] = array('ad_id'=>$rowOption->get_OptionID() );
}
echo json_encode($IDOption);
 
 
risultato:
{"11":{"ad_id":"11"},"12":{"ad_id":"12"},"13":{"ad_id":"13"}}
Mi rimane sempre l'ID iniziale
Come tolgo questi valori e la prima parentesi e l'ultima? {"11":  "12": 
  "13":  }
 

 echo json_encode($IDOption);
 
Aggiungendo a un array con le parentesi vuote usi gli array con indice 
numerico, che vengono trasformati in array javascript.
 
Bye.

 array('ad_id'=>$rowOption->get_OptionID() );
 
 
Grazie Mille
non so come ringraziarti
 
 

Il 14/11/2012 15:02, Alessandro Pellizzari ha scritto:

Ho una domanda ulteriore visto sto facendo ulteriori prove.
mi trovo alcuni echo che iniziano e chiudono con [] e alcuni con {}
come determino inizio e fine con una parentesi rispetto ad un'altra?
 
 

Il 14/11/2012 15:02, Alessandro Pellizzari ha scritto:

Faccio una confusione con sti array e json_encode
 
vediamo sto quesito
Facendo in questa maniera
$packData = getPack($pack);	
$packCapacities = array();
foreach ($packData as $rowPack) {
  $packCapacities[] = 
array($rowPack->get_ProductID()=>$rowPack->get_Capacities());
}
echo json_encode($packCapacities);
 
ottengo: [{"136":"1"},{"137":"1"},{"138":"1"}]
 
se utilizzo l'esempio sottostante
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo json_encode($arr);
 
ottengo ed è quello che vorrei ottenere io:
{"a":1,"b":2,"c":3,"d":4,"e":5}
 
ma io con questa riga $packCapacities[] = 
array($rowPack->get_ProductID()=>$rowPack->get_Capacities());
non faccio la stessa array? '136'=>1,'137'=>1,'138'=>1
perche invece mi da stringa errata?
 
 


Riuscito da solo
 
  	require_once( 'gestione/pack-manager.php' );
     $packData = getPack($Prezzo );
	//$packCapacities = array();
	foreach ($packData as $rowPack) {
		$packCapacities[$rowPack->get_ProductID()] = $rowPack->get_Capacities();
	}
 
	echo json_encode($packCapacities);



Scusa Alessandro....
 
ho una piccola richiesta
come faccio a togliere le "" al secondo valore della array?
foreach ($priceData as $rowPrice) {
    $PriceProduct[$rowPrice->get_ProductID2(). '_' . 
$rowPrice->get_Capacity() . '_' . $rowPrice->get_ProductID()] = 
$rowPrice->get_PriceProduct();
	}
echo json_encode($PriceProduct);
questo è il risultato
{"99_300_2":"0.61","99_300_10":"0.78","99_300_12":"0.81"}
ma dovrei togliere le "" al secondo valore facendolo diventare cosi:
{"99_300_2":0.61,"99_300_10":0.78,"99_300_12":0.81}
devo fare dei calcoli e con le "" mi da errore perche credo lo riconosce 
come testo e non come numero
 
 
 

 come testo e non come numero
 
Se lo usi con javascript o con PHP, TEORICAMENTE dovrebbe trasformarlo da 
solo in virgola mobile.
 
Se lo usi con altri sistemi strictly typed (Java, .Net, ecc.) ti conviene 
modificare il "consumatore" per verificare e/o convertire i dati prima di 
usarli.
 
Bye.


Vado sempre sul piu difficile...
 
foreach ($prezzooptionData as $rowPriceOption) {
    $PriceOption[$rowPriceOption->get_ProductID(). '_'] = 
$rowPriceOption->get_Prezzooption();
}
questo mi da:
{"17_":"0.00","18_":"0.00"}
 
foreach ($prezzooptionaddData as $rowPriceOptionAdd) {
    $PriceOptionAdd[$rowPriceOptionAdd->get_ProductID()] = 
$rowPriceOptionAdd->get_Prezzooptionadd();
}	
questo mi da:
{"17_1":"0.20","17_2":"0.39","17_3":"0.59","17_4":"0.79","17_5":"0.98","18_1":"0.15","18_2":"0.29"}
 
 
adesso cosa ho fatto da scemo:
echo "var options_prices = " .json_encode($PriceOption). 
json_encode($PriceOptionAdd)
e mi ha dato:
{"17_":"0.00","18_":"0.00"}{"17_1":"0.20","17_2":"0.39","17_3":"0.59","17_4":"0.79","17_5":"0.98","18_1":"0.15","18_2":"0.29"}
 
 
includere due array in una è possibile?
dovrei avere sto risultato:
{"17_":"0.00","18_":"0.00","17_1":"0.20","17_2":"0.39","17_3":"0.59","17_4":"0.79","17_5":"0.98","18_1":"0.15","18_2":"0.29"}
 


risolto da solo....
 
bastava creare una array univoca...
$PriceOption[