PHP stampare array multidimensionale

Ehm..11
Salve,
qualcuno mi potrebbe dare qualche idea su come fare a stampare (o meglio trasformare un array multidimensionale in uno "lineare"). Adesso mi spiego, ho un array di questo genere:

$il-mio-array = array('a' =>array( 'aa', 'ab', ..., 'an' =>array ( 'an1', 'an2', ...)),
                      'b', 'c', ...',
                      'm' =>array( 'ma','mb', ..., 'mk' =>array ('mk1','mk2',...)),
                      ...)


In sostanza io ho un array che contiene un numero finito e non precisato di variabili che possono essere o stringhe o array. Ogni array contiene almeno una stringa e può contenere altri array.
Quello che mi serve è trasformare questo array-mostro in un array che contenga come elementi tutte le stringhe + i rispettivi nomi dei singoli array annidati in maniera da poterci lavorare più semplicemente.

A me era venuto in mente di utilizzare una serie di foreach sapendo che il mio array contiene al massimo 5 array ad effetto matrioska (scusate il linguaggio eccessivamente tecnico :D ), ma questa soluzione mi sembra poco lineare e poco utile nel caso di situazioni con numeri maggiori di array annidati.

Come posso fare?

Mi ero scordato di dire che sto lavorando in PHP.

Risposte
apatriarca
Immagino si possa riuscire a fare qualcosa usando una qualche funzione ricorsiva che viene richiamata nel caso in cui si debba andare oltre nei livelli dell'array. E' però da tempo che non programmo qualcosa in PHP e non ricordo se sia possibile farlo.

Ma a che cosa ti serve un mostro del genere?

hamming_burst
"Ehm..":

trasformare un array multidimensionale in uno "lineare")

non conosco PHP, ma se hai un array in simboli $array[n][n]$ per trasformarlo in uno lineare cioè $array[n^2]$
basta semplicemente allocare un array lineare della dimensione della controparte multidimensionale, e navigare con le coordinate multidimensionali con una funzione apposita $\text{coor}()$
Esempio un array bidimensionale con $n$ colonne, coordianata di colonna $j$, coordinata di riga $i$, basta calcolari $\text{coor}(i,j) = i*n + j$ dove darà l'indice lineare :-)

apatriarca
Gli array in PHP sono più che altro quello che in altri linguaggi si chiamerebbe una mappa, dove il tipo di indici è però limitato a interi e stringhe e il tipo degli elementi può essere qualsiasi. In uno stesso array ci possono cioè essere elementi di tipo diverso. Non è quindi possibile ragionare come in linguaggi come C, C++, C#, Java..

hamming_burst
"apatriarca":
Gli array in PHP sono più che altro quello che in altri linguaggi si chiamerebbe una mappa, dove il tipo di indici è però limitato a interi e stringhe e il tipo degli elementi può essere qualsiasi. In uno stesso array ci possono cioè essere elementi di tipo diverso. Non è quindi possibile ragionare come in linguaggi come C, C++, C#, Java..

ecco come non detto, grazie della smentita :-)

Ehm..11
"apatriarca":
Ma a che cosa ti serve un mostro del genere?


Mi serve per poter prelevare dati da dei file qualsiasi e poi trasformarli in form. Infine grazie all'array monodimensionale che mi vado a costruire posso rielaborarli e inserirli in database.

Comunque penso di aver trovato un metodo che funzioni.. devo però cambiare il programma che legge i file di modo che l'array si possa scrivere come quello che ipotizzava hamming_burst. In questa maniera posso ragionare come serie di interi a cui associo le stringhe di testo e i nomi, avrei potuto utilizzare anche 5 foreach ma con gli interi dovrebbe uscire qualcosa di più ordinato (credo).
Il fatto è che speravo ci fosse una funzione di quelle conosciute solo dai creatori del php che mi trasforma una matrice n-dimensionale in un array mono-dimensionale.

cyd1
qualcosa del tipo
function nomeoriginale(&$in,$pre='',&$out=false){
 foreach($in as $name=>$value){
   $vname=$pre.(empty($pre) ? '' : '_').$name
   if(is_array($value))
     nomeoriginale($value,$vname,$out);
   elseif(is_string($value))
     $out[$vname]=$value;
    #else eccezione
 }
 return $out;

}


l'ho scritta ora non l'ho testata, non è molto elegante ma concettualmente dovrebbe andare. in è l'arraymostro out quello monodimensionale. $out sarà della forma array('a1_a11_a123_0' => 'stringa', 'a1_a12_0'=>'stringa' ...) cioè salva in successione nel nome tutti i nomi degli array annidiati.

apatriarca
Il codice di cyd è più o meno quello che avevo in mente parlando di funzione ricorsiva.

Facendo qualche ricerca ho trovato la funzione array_walk_recursive che immagino sia praticamente implementata come il codice di cyd, che può essere usato per eseguire una qualche operazione su tutti gli elementi dell'array in modo ricorsivo (considerando quindi anche gli array figli).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.