11. februar 2006 - 15:02
Der er
20 kommentarer og 2 løsninger
Gennemløb af array med arrays - hvordan
På
http://famnissen.dk/downloads/struct.txt ligger resultatet af en print_r($struct). $struct stammer fra $struct = imap_fetchstructure($mailbox, $msg_number); og viser en tilfældig mailstruktur.
SPRØGSMÅL:
Hvordan gennemløber jeg dette array, og udskriver alle [subtype] elementer ?
Antallet af elementer kan være mellem 1 og mange og ligeledes med antallet af niveauer (arrays inden i arrays).
Dsv. jeg søger et ordentligt alternativ til nedenstående "stenalder" metode, men er løbet sur i forearch og lign...
echo $struct->subtype.'<br>';
echo $struct->parts[0]->subtype.'<br>';
echo $struct->parts[0]->parts[0]->subtype.'<br>';
echo $struct->parts[0]->parts[1]->subtype.'<br>';
echo $struct->parts[0]->parts[2]->parts[0]->subtype.'<br>';
echo $struct->parts[0]->parts[2]->parts[1]->subtype.'<br>';
echo $struct->parts[1]->subtype.'<br>';
Annonceindlæg fra Infor
Slettet bruger
11. februar 2006 - 15:07
#1
<?php function dims($array, $prefix='', $postfix='') { foreach($array as $value) { if(is_array($value)) { function dims($value, $prefix, $postfix); } else { print $prefix . $value . $postfix; } } } // example dims($struct->parts); ?> - Er det noget i den stil du søger?
Slettet bruger
11. februar 2006 - 15:08
#2
Ups - rettelse: // example dims($struct->parts, "", "<br>");
11. februar 2006 - 15:13
#3
Rettede også linie 4, hvor der var et function for meget :) function dims($array, $prefix='', $postfix='') { foreach($array as $value) { if(is_array($value)) { dims($value, $prefix, $postfix); } else { print $prefix . $value . $postfix; } } } // example dims($struct->parts, "", "<br>"); Men Output bliver kun til Object Object Og hvis jeg ændre til dims($struct, "", "<br>"); kommer første niveau 1 0 1 MIXED 0 0 710623 0 0 1 Object Object Object
11. februar 2006 - 15:16
#4
og dims($struct->parts[0], "", "<br>"); giver næste niveau 1 0 1 ALTERNATIVE 0 0 2526 0 0 1 Object Object Object Din funktion kommer ikke rigtig ned i næste niveau (rekursivt)
Slettet bruger
11. februar 2006 - 15:19
#5
Jeg har lige prøvet at køre følgende: <?php function dims($array, $prefix='', $postfix='') { foreach($array as $value) { if(is_array($value)) { dims($value, $prefix, $postfix); } else { print $prefix . $value . $postfix; } } } $hej[] = 1; $hej[] = "1a"; $hej[][] = "prid"; $hej[42][] = "dme"; $hej[43][] = array("lull", 1 => 42, "hej"); dims($hej, "", "<br>"); ?> - Og det virker fint. Måske forstår jeg ikke helt hvad du vil?
Slettet bruger
11. februar 2006 - 15:24
#6
Ah - nu er jeg med... Det er ikke bare et multidimensionelt array, der er objekter indblandet hist og her?
Slettet bruger
11. februar 2006 - 15:31
#7
Prøv således så: function dims($array, $prefix='', $postfix='') { foreach($array as $value) { if(is_array($value) || is_object($value)) { dims($value, $prefix, $postfix); } else { print $prefix . $value . $postfix; } } }
11. februar 2006 - 15:37
#8
eller dette ( læg mærke til at referencerne til parts er bibeholdt) function searchParts(&$obj){ if ( isset($obj->subtype) ) print $obj->subtype."<br>"; if ( isset($obj->parts) && is_array($obj->parts) ) { for ( $i = 0; $i < count($obj->parts); $i++ ) { if( is_object($obj->parts[$i]) ) searchParts($obj->parts[$i]); } } }
11. februar 2006 - 15:54
#9
Imponerende kode ! Begge stumper virker fint, dog er horsmark præcis hvad jeg ønsker. Smider I begge et svar | 50/50 point - ok ? Tak for hjælpen (jeg skal nok læse lidt mere om arrays og objekter...)
Slettet bruger
11. februar 2006 - 15:56
#10
Svar. Selv tak.
11. februar 2006 - 16:04
#11
svar her også - vær lige endnu engang opmærksom på at når du arbejder med objecter må du _ikke_ bruge foreach løkker da foreach tager en kopi af det array du ønsker at løbe igennem ... og ydermere referencer (det er derfor der er et & foran variablen i $parameter) ..men fint det virker :-)
11. februar 2006 - 16:20
#12
horsmark kan din kode udvides til at returnere et array med - niveau (f.eks. 1.1) - subtype - encoding fremfor print ?
11. februar 2006 - 16:30
#13
hmm nu bliver du besværlig *G* $aResult = array(); function searchParts(&$obj, $iDepth = 0 ){ $iDepth++; if ( isset($obj->subtype) ){ $aResult[] = array( "depth" => $iDepth, "subtype" => $obj->subtype, "encoding" => $obj->encoding } if ( isset($obj->parts) && is_array($obj->parts) ) { for ( $i = 0; $i < count($obj->parts); $i++ ) { if( is_object($obj->parts[$i]) ) searchParts($obj->parts[$i], $iDepth); } } }
11. februar 2006 - 16:31
#14
print_r($aResult); aner ikke om det virker...
11. februar 2006 - 16:56
#15
Det giver mig desværre kun en blank skærm. Kunne funktionen returnere encoding, hvis den (baglæns) først finder HTML (1. prioritet) eller en PLAIN (2. prioritet) kun hvis HTML ikke findes). Med din oprindelige funktion printes (inkl encoding): MIXED - 0 ALTERNATIVE - 0 PLAIN - 1 HTML - 4 VND.MS-POWERPOINT - 3 PS: kaster lige 50 point mere i spørgsmålet !
11. februar 2006 - 17:02
#16
yes det er fordi jeg ikke kan skrive rent *GG* $aResult = array(); function searchParts(&$obj, $iDepth = 0 ){ $iDepth++; if ( isset($obj->subtype) ){ $aResult[] = array( "depth" => $iDepth, "subtype" => $obj->subtype, "encoding" => $obj->encoding); } if ( isset($obj->parts) && is_array($obj->parts) ) { for ( $i = 0; $i < count($obj->parts); $i++ ) { if( is_object($obj->parts[$i]) ) searchParts($obj->parts[$i], $iDepth); } } }
11. februar 2006 - 17:22
#17
skærmen er ikke mere blank, men print_r[$aResult) giver blot Array ( ) ??
11. februar 2006 - 17:27
#18
Nårh det er fordi den ikke er gjort global $aResult = array(); function searchParts(&$obj, $iDepth = 0 ){ Global $aResult; $iDepth++; if ( isset($obj->subtype) ){ $aResult[] = array( "depth" => $iDepth, "subtype" => $obj->subtype, "encoding" => $obj->encoding); } if ( isset($obj->parts) && is_array($obj->parts) ) { for ( $i = 0; $i < count($obj->parts); $i++ ) { if( is_object($obj->parts[$i]) ) searchParts($obj->parts[$i], $iDepth); } } }
11. februar 2006 - 17:38
#19
Nice, nu virker det helt perfekt - Tak for hjælpen. Fremfor at lave den global, kunne man så overføre den som en parameter eller lign ?
11. februar 2006 - 17:46
#20
yesyes function searchParts(&$obj, $iDepth = 0, $aResult = array() ){ $iDepth++; if ( isset($obj->subtype) ){ $aResult[] = array( "depth" => $iDepth, "subtype" => $obj->subtype, "encoding" => $obj->encoding); } if ( isset($obj->parts) && is_array($obj->parts) ) { for ( $i = 0; $i < count($obj->parts); $i++ ) { if( is_object($obj->parts[$i]) ) searchParts($obj->parts[$i], $iDepth, $aResult); } } }
11. februar 2006 - 23:33
#21
Skal jeg kalde dem med searchParts($struct,0,$aResult); hvis ja, så kommer der ikke noget ud med print_r($aResult);
12. februar 2006 - 05:55
#22
du burde blot kunne kalde funktionen således... $mitArray = array(); searchParts($struct, 0, $mitArray); print_r($mitArray) selvfølgeligt vil den pæne version være sådan: $mitArray = searchParts($struct); men det kræver lige en ekstra funktion...
Vi tilbyder markedets bedste kurser inden for webudvikling