Avatar billede gertnissen Nybegynder
11. februar 2006 - 15:02 Der er 20 kommentarer og
2 løsninger

Gennemløb af array med arrays - hvordan

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>';
Avatar billede 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?
Avatar billede Slettet bruger
11. februar 2006 - 15:08 #2
Ups - rettelse:

// example
dims($struct->parts, "", "<br>");
Avatar billede gertnissen Nybegynder
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
Avatar billede gertnissen Nybegynder
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)
Avatar billede 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?
Avatar billede 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?
Avatar billede 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;
    }
  }
}
Avatar billede horsmark Nybegynder
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]);
  }
}
}
Avatar billede gertnissen Nybegynder
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...)
Avatar billede Slettet bruger
11. februar 2006 - 15:56 #10
Svar. Selv tak.
Avatar billede horsmark Nybegynder
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 :-)
Avatar billede gertnissen Nybegynder
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 ?
Avatar billede horsmark Nybegynder
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);
  }
}
}
Avatar billede horsmark Nybegynder
11. februar 2006 - 16:31 #14
print_r($aResult);

aner ikke om det virker...
Avatar billede gertnissen Nybegynder
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 !
Avatar billede horsmark Nybegynder
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);
    }
  }
}
Avatar billede gertnissen Nybegynder
11. februar 2006 - 17:22 #17
skærmen er ikke mere blank, men print_r[$aResult) giver blot Array ( ) ??
Avatar billede horsmark Nybegynder
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);
    }
  }
}
Avatar billede gertnissen Nybegynder
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 ?
Avatar billede horsmark Nybegynder
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);
    }
  }
}
Avatar billede gertnissen Nybegynder
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);
Avatar billede horsmark Nybegynder
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...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester