Newsgroup: it.comp.www.php
Titolo: riconoscimento key su array multidimensionale (lungo)

Salve a tutti,
tempo fa il buon iuz 
http://tinyurl.com/63fsn
 mi aveva aiutato nella
scrittura di un codice che, da una distinta, mi ricreava la struttura in
un'array.
$ch = fopen($file, 'r');
  $p_list = $p2_list = $result = array();
  while(FALSE !== ($line = fgets($ch)))
  {
    list($commessa, $father, ,$current) = explode('|', rtrim($line), 5);
    settype($commessa, "string");
    settype($father, "string");
    settype($current, "string");
    if ($commessa!="" && $father!=""  && $current!="" )
    {
     if(!isset($p_list[$father]))
     {
       $result[$father] = array();
       $p_list[$father] =& $result[$father];
       $p_list[$father][$current] = array();
     }
     else
     {
       $p_list[$father][$current] = array();
       $p_list[$current] =& $p_list[$father][$current];
     }
    }
  }
  var_dump($result);
Tale distinta, su un file esterno, rappresentava la struttura a cascata
delle parti di una macchina composti di assiemi e sottoassiemi e
sottosottoassiemi e così via. Le "particolarità" di ogni singola parte sono
separate, nella propria riga da |; la parti sono separate dall'accapo.
quindi mi ritrovo con una distinta di questo tipo
1D4010|80B080000|000010|B08960003|C8|||00000002,0000|||||03/11/2004
1D4010|80B080000|000020|B08975002|P6|||00000002,0000|||||03/11/2004
1D4010|80B080000|000030|B08998000|A3|||00000024,0000|||||03/11/2004
1D4010|B08998000|000010|B08970001|P4|||00000024,0000|||||03/11/2004
1D4010|B08998000|000200|999700031||||00000024,0000|||||03/11/2004
1D4010|80B080000|000040|B08970000|P4|||00000024,0000|||||03/11/2004
il secondo record rappresena il codice padre, il quarto il codice figlio e
tramite l'elaborazione di questi mi ricostruisco la struttura della macchina
Ora, tutto andava bene e riusciva a ricostruirmi la struttura finchè non ho
cambiato la distinta con quella vera
1D4010|8B0800001|000005|829800010||||00000001,0000|||||11/02/2005
1D4010|829800010|000010|059860004||||00000002,0000|||||11/02/2005
1D4010|829800010|000020|021860047||||00000001,0000|||||11/02/2005
1D4010|8B0800001|000010|8B0801000|||G|00000001,0000|||||11/02/2005
1D4010|8B0801000|000010|B08090000|B003|||00000001,0000|||||11/02/2005
1D4010|8B0801000|000020|B08130002||||00000010,0000|||||11/02/2005
1D4010|8B0801000|000030|B08715005|S002|||00000002,0000|||||11/02/2005
1D4010|8B0801000|000050|B08340000||||00000010,0000|||||11/02/2005
1D4010|8B0801000|000060|A036788||||00000002,0000|||||11/02/2005
1D4010|8B0801000|000070|B08089004|B002|||00000004,0000|||||11/02/2005
e mi va in palla, non rispetta più la gerarchia, difatti il risultato, nel
var_dump, è questo
array(2) {
  ["8B0800001"]=>
  &array(2) {
    [829800010]=>
    array(0) {
    }
    ["8B0801000"]=>
    &array(6) {
      ["B08090000"]=>
      &array(0) {
      }
      ["B08130002"]=>
      &array(0) {
      }
      ["B08715005"]=>
      &array(0) {
      }
      ["B08340000"]=>
      &array(0) {
      }
      ["A036788"]=>
      &array(0) {
      }
      ["B08089004"]=>
      &array(0) {
      }
    }
  }
  [829800010]=>
  &array(2) {
    ["059860004"]=>
    array(0) {
    }
    ["021860047"]=>
    &array(0) {
    }
  }
}
mi crea cioè l'array 829800010 nell'array principale, quando, secondo la
distinta, dovrebbe essere dentro l'8B0800001.
e difatti me lo mette pure li, ma non me lo riconosce quando gli butto
dentro le due parti
&array(2) {
    ["059860004"]=>
    array(0) {
    }
    ["021860047"]=>
    &array(0) {
    }
boh, il concetto dovrebbe essere lo stesso ma non me lo prende.
ho provato anche a convertire in string tutti i codici, che magari non li
riconosce uguali ma niente
anzi, addirittura quel codice li non lo converte.
boh? ci sto sbattendo la testa da ieri ma ancora non sono riuscito a trovare
la soluzione
aiuto :(
grazie
-- 
Sousa - 
http://laBoratorio.sousa.it
 - just.sousa{at}katamail{dot}com

ok, risolto.
mancava proprio il riferimento all'ultimo array creato in caso di true nella
condizione
while(FALSE !== ($line = fgets($ch)))
  {
    list($commessa, $father, ,$current) = explode('|', rtrim($line), 5);
    settype($commessa, "string");
    settype($father, "string");
    settype($current, "string");
    if ($commessa!="" && $father!=""  && $current!="" )
    {
     if(!isset($p_list[$father]))
     {
       $result[$father] = array();
       $p_list[$father] =& $result[$father];
       $p_list[$father][$current] = array();
        $p_list[$current] =& $p_list[$father][$current];
     }
     else
     {
       $p_list[$father][$current] = array();
       $p_list[$current] =& $p_list[$father][$current];
     }
    }
  }
ciao


Bè, qualcosa in più ho scoperto.
la differenza tra le due distinte sta nel fatto che in quella funzionante la
seconda riga è una parte sull'array principale, mentre nella distinta che mi
sballa la seconda riga è figlia della prima ossia:
distinta che funziona
1D4010|80B080000|000010|B08960003|C8|||00000002,0000|||||03/11/2004
1D4010|80B080000|000020|B08975002|P6|||00000002,0000|||||03/11/2004
stesso assieme
distinta che non funziona
1D4010|8B0800001|000005|829800010||||00000001,0000|||||11/02/2005
1D4010|829800010|000010|059860004||||00000002,0000|||||11/02/2005
la seconda è parte del primo assieme
difatti aggiungendo nella distinta 1 due parti figli nella seconda e terza
riga mi fa lo stesso scherzo
1D4010|80B080000|000010|B08960003|C8|||00000002,0000|||||03/11/2004
1D4010|B08960003|000020|B08975006|P6|||00000002,0000|||||03/11/2004
1D4010|B08960003|000020|B08975007|P6|||00000002,0000|||||03/11/2004
1D4010|80B080000|000020|B08975002|P6|||00000002,0000|||||03/11/2004
1D4010|80B080000|000030|B08998000|A3|||00000024,0000|||||03/11/2004
forse un problema di riferimenti?


 
ho fatto un brutto errore.. imbarazzante.. 
grazie comunque delle correzioni..
-- 
www.iuz-lab.info

assolutamente! se non era per te stavo ancora in alto mare :).
grazie iuz
cia
