Newsgroup: it.comp.www.php
Titolo: convertire da array di oggetti a array di membri degli oggetti

Ciao,
non sono impazzito, mi chiedevo solo se è possibile fare una cosa del 
genere IN UNA RIGA:
ho un array oggetti[] che contiene tanti oggetti di tipo Elemento.
Elemento ha due membri: Elemento->membro1 e Elemento->membro2
Vorrei trovare un costrutto tipo: $oggetti[]->membro2 , che mi 
restituisca un array con dentro tutti i valori di membro2 degli Elemento 
contenuti in oggetti[]
In pratica la nuova array sara così:
nuovaarray[0]=$oggetti[0]->membro2;
nuovaarray[1]=$oggetti[1]->membro2;
nuovaarray[2]=$oggetti[2]->membro2;
...
Sapete se e come si può fare (IN UNA RIGA/ISTRUZIONE) ?
Grazie
Bye!

 Bye!
se ho capito bene..
array_walk($oggetti, create_function('$a, $b, $result', '$result[] =
$a->membro2;'), &$result);
ma perche' proprio su una sola riga?
-- 
www.iuz-lab.info

iuz ha scritto:

l'idea è buona, ma mi esce questo errore:
Warning: Call-time pass-by-reference has been deprecated - argument 
passed by value; If you would like to pass it by reference, modify the 
declaration of array_walk(). If you would like to enable call-time 
pass-by-reference, you can set allow_call_time_pass_reference to true in 
your INI file. However, future versions may not support this any longer.
Grazie comunque per l'aiuto
bye!

 your INI file. However, future versions may not support this any longer.
[..]
che versione di php usi? 
l'ho provato su php 6.0.0-dev e funziona correttamente..
comunque prova..
array_walk($oggetti, create_function('$a', 'global $result; $result[] =
$a->membro2;'));
-- 
www.iuz-lab.info

iuz ha scritto:

La versione di php che uso č 4.4.2, gioca a zona... :-D
Comunque grazie, questa seconda versione non dą neanche il warning 
grazie alla global.
L'ideale sarebbe, nella stessa riga, fare restituire anche direttamente 
l'array. E' possibile?
E' quasi accanimento accademico, DEVO trovare il modo :-D
bye!

 bye!
dimmi come e dove la vuoi utilizzare..
-- 
www.iuz-lab.info

Generale Cluster wrote:

ci sarebbe questa soluzione ma e' un'po' come barare..
eval("array_walk(\$objs, create_function('\$a', 'global \$res; \$res[] =
\$a->membro2;')); return \$res;");
-- 
www.iuz-lab.info

iuz ha scritto:

mettiti comodo:
mi sono fatto una libreria di funzioni per crearmi i tag HTML più usati 
con una riga di php. Nel caso specifico, ho la funzione:
function fillHtmlSelectMultiple($myArray, $name, $class='', 
$selectedVal=NULL, $props='')
che mi crea una select multiple, la riempie con le coppie chiave-valore 
  che trova in $myArray e preseleziona le righe cha hanno valore uguale 
a uno di quelli contenuti dentro l'array $selectedVal.
In fase di raccolta dei dati dal DB, ho il codice che mi preleva i 
valori dal DB:
$risorsa=RisorsaHandler::getById($_REQUEST["idn"]);
dove $risorsa contiene un membro array "aProblemi" che rappresenta i 
problemi selezionati per quella risorsa.
e poi in mezzo alla pagina chiamo:
<?php 
fillHTMLSelectMultiple($aProblemi,"problemi","",array_walk($risorsa->aProblemi,create_function('$a,$b','return 
$a->cod_problema;')),'size="5"')?>
tutto in una riga, che chiunque anche senza conoscere il php può 
prendere e spostare dove vuole senza incasinarmi il codice.
Il problema mio adesso è cosa aggiungere davanti a "array_walk" :-)
Lo so che potrei cavarmela creando una nuova array in cima allo script, 
utilizzando due righe di codice, ma trovo che in una sola riga sia, 
seppur meno comprensibile, decisamente più mantenibile dal punto di 
vista dell'impaginazione. E poi ormai è una questione di principio ^__^
bye!

 
Lo sapevo che si poteva fare! :-)
Eccola:
$lista = array_map(create_function('$a','return 
$a->cod_problema;'),$risorsa->membro2);
Grazie per le dritte utilissime, oggi ho scoperto 3 funzioni che non 
sapevo usare .
Bye!