imap_list -> mehrdimensionales Array

doribell

Mitglied
Hallo,

ich versuche seit Stunden einen Algorythmus zu entwerfen der mir das von imap_list() zurückgegebene Array in ein für mich brauchbares wandeln kann.

imap_list return:
PHP:
array(15) {
  [0]=>
  string(33) "{imap.example.de:143}INBOX.1und1"
  [1]=>
  string(38) "{imap.example.de:143}INBOX.1und1.test"
  [2]=>
  string(43) "{imap.example.de:143}INBOX.1und1.test.test"
  [3]=>
  string(31) "{imap.example.de:143}INBOX.AVM"
  [4]=>
  string(39) "{imap.example.de:143}INBOX.Bewerbungen"
  [5]=>
  string(34) "{imap.example.de:143}INBOX.Drafts"
  [6]=>
  string(35) "{imap.example.de:143}INBOX.Maxdome"
  [7]=>
  string(40) "{imap.example.de:143}INBOX.Neue Impulse"
  [8]=>
  string(35) "{imap.example.de:143}INBOX.Paysave"
  [9]=>
  string(32) "{imap.example.de:143}INBOX.Sent"
  [10]=>
  string(38) "{imap.example.de:143}INBOX.Server4you"
  [11]=>
  string(47) "{imap.example.de:143}INBOX.StartCom CertMaster"
  [12]=>
  string(33) "{imap.example.de:143}INBOX.Trash"
}

Es handelt sich bei den Strings um eine Ordnerstruktur des Imap-Postfachs. Im Ordner 1und1 habe ich zum testen Unterordner erstellt.

Ein für mich brauchbares Array wäre nun folgendes: In der ersten Ebene alle Ordner die in der INBOX sind. Diese Ordner enthalten jeweils Arrrays mit den Unterordnern usw.

Mir glüht echt der Kopf ich habe bis jetzt jeden Ansatz wieder verworfen, ich bin offen für jeden Tip der zu Erfolg führt.
 
Des Rätsels Lösung ist Rekursion. Ich hätte dir gerne dazu einen kleinen Codeschnipsel präsentiert, aber auch nach einer Stunde tüffteln bin ich zu keiner konkreten Lösung gekommen.

Damit bekommst du zumindest die Daten in ein Format, mit dem man auch arbeiten kann:
PHP:
foreach($list as $i => $point) {
  list(, $point) = explode('}', $point, 2);
  $list[$i] = explode('.', $point);
  unset($list[$i][0]);
  $list[$i] = array_values($list[$i]);
}
 
Danke für den Tipp mit der Rekursion, das versuchte ich gestern umständlich mit eigenen functions zu lösen.

Ich habe mir ebend nochmal alle Manuals zum Thema Arrays angeschaut und array_merge_recursive gefunden().

Lösung:

PHP:
$array = @imap_list($this -> socket, $server, $pattern) or $this -> error();

$boxes = array();

foreach($array as $str) {
	
	$temp = array();
					
	$explode = explode('.', str_replace($server, null, $str));
					
	if (count($explode) > 0) {
						
		for($i = count($explode)-1; $i >= 0; $i--) {
							
			if (count($temp) == 0) {
								
				$temp[$explode[$i]] = array();
			} else {
								
				$temp = array($explode[$i] => $temp);
			}
		}
						
		$boxes = array_merge_recursive($boxes, $temp);
	}
}

Die Lösung ist mit Sicherheit noch nicht endgültig, allerdings kann ich damit erstmal leben und an anderen Stellen weiter arbeiten. Die Array sieht nun so aus wie ich sie mir vorgestellt habe.
 
Zuletzt bearbeitet:
Zurück