Array rekursiv auslesen Problem

dobermant

Erfahrenes Mitglied
Servus liebes Forum,

Folgendes Problem.
Ich möchte ein mehrdimensionales Array auslesen und in einem bestimmten Format ausgeben. Wenn das Arrayelement keine weiteren Unterelemente hat, dann soll x ausgegeben werden, ansonsten y.

Dazu habe ich eine Funktion erstellt, die alle Elemente ausliest. Falls Unterelemente auftreten ruft sich die Funktion selber auf. Das klappt sowit alles ganz gut, aber jetzt komme ich an meine Grenzen und verliere den Überblick.

Das Problem ist bei der Ausgabe zu sehen.
Wie muss ich meine Funktion erweitern, dass er nachdem alle Childreens ausgelesen hat, auch wirklich mit ] abschliesst. Auch weiss ich nicht wie ich beeinflussen kann, dass nach einem letzten Element kein , ausgegeben wird.

Vielen Dank für die Hilfe!
Dober

Hier das Array
PHP:
$dir =  array(
    'M-Marketing' => array(
        'M0-Vordrucke' => null,
        'M1-Allgemein' => null,
        'M2-Vertrieb'  => null
        ),
	
    'S-Studium' => null
);  

$output = '[{';
$output.=rekurs($dir);
$output.='}]';

sowie die Funktion zum auslesen
PHP:
function rekurs($ar){
global $output;
	foreach ($ar as $key => $value) {
		if (is_array($value)) {

			$output.="
			task:'".$key."',
    		duration:'5',
    		user:'',
    		uiProvider:'col',
    		cls:'master-task',
    		iconCls:'task-folder',
    		children:[
			\n";
						
			rekurs($value);

		} else {
			$output.="		
			{
			task:'".$key."',
			duration:'5',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
			},\n";
	
		}
			
	}
	return $output;
}

Die Ausgabe sieht wie folgt aus
PHP:
[{
task:'M-Marketing',
duration:'5',
user:'',
uiProvider:'col',
cls:'master-task',
iconCls:'task-folder',
children:[
{
	task:'M0-Vordrucke',
	duration:'5',
	user:'Jack Slocum',
	uiProvider:'col',
	leaf:true,
	iconCls:'task'
	},{
	task:'M1-Allgemein',
	duration:'5',
	user:'Jack Slocum',
	uiProvider:'col',
	leaf:true,
	iconCls:'task'
	},{
	task:'M2-Vertrieb',
	duration:'5',
	user:'',
	uiProvider:'col',
	cls:'master-task',
	iconCls:'task-folder',
    }, // da es das letzte Child ist, darf kein Komma ausgegeben werden, sondern ein ]

}]


Hier noch zur Ansicht eine funktionierende Ausgabe, wo alles korrekt ist
PHP:
[{
    task:'Online',
    duration:'3 hours',
    user:'',
    uiProvider:'col',
    cls:'master-task',
    iconCls:'task-folder',
    children:[{
        task:'DMS KnowledgeTree',
		duration:'3 hours',
		user:'',
		uiProvider:'col',
		cls:'master-task',
		iconCls:'task-folder',
		children:[{
			task:'Dokument1',
			duration:'15 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		},{
			task:'Dokument2',
			duration:'45 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		}]
	},{
        task:'Offline',
		duration:'3 hours',
		user:'',
		uiProvider:'col',
		cls:'master-task',
		iconCls:'task-folder',
		children:[{
			task:'Bewerberliste',
			itemid:'1',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		},{
			task:'Dokument2',
			duration:'45 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		}]
	},{
        task:'Sonstiges',
		duration:'3 hours',
		user:'',
		uiProvider:'col',
		cls:'master-task',
		iconCls:'task-folder',
		children:[{
			task:'Dokument1',
			duration:'15 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		},{
			task:'Dokument2',
			duration:'45 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		}]
	},{
			task:'Dokument 1, nicht zugeordnet',
			duration:'45 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		}]
},{
    task:'Lokal',
    duration:'2 1/2 hours',
    user:'',
    uiProvider:'col',
    cls:'master-task',
    iconCls:'task-folder',
   children:[{
        task:'Briefe',
		duration:'3 hours',
		user:'',
		uiProvider:'col',
		cls:'master-task',
		iconCls:'task-folder',
		children:[{
			task:'Dokument1',
			duration:'15 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		},{
			task:'Dokument2',
			duration:'45 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		}]
	},{
        task:'Vordrucke',
		duration:'3 hours',
		user:'',
		uiProvider:'col',
		cls:'master-task',
		iconCls:'task-folder',
		children:[{
			task:'Dokument1',
			duration:'15 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		},{
			task:'Dokument2',
			duration:'45 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		}]
	},{
        task:'Rechnungswesen',
		duration:'3 hours',
		user:'',
		uiProvider:'col',
		cls:'master-task',
		iconCls:'task-folder',
		children:[{
			task:'Dokument1',
			duration:'15 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		},{
			task:'Dokument2',
			duration:'45 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		}]
	},{
			task:'Dokument 1, nicht zugeordnet',
			duration:'45 min',
			user:'Jack Slocum',
			uiProvider:'col',
			leaf:true,
			iconCls:'task'
		}]

}]
 
Du musst dich entscheiden: Entweder arbeitest du direkt mit der globalen Variable oder aber gibst nur einen Rückgabewert zurück. Wenn du beides machst, bekommst du nur Redundanzen.
Ich rate dir zu letzterem:
PHP:
function rekurs($ar)
{
	$output = '';
	foreach ($ar as $key => $value) {
		if (is_array($value)) {
			$output .= "…";
			$output .= rekurs($value);
		} else {
			$output .= "…";
		}
	}
	return $output;
}
 
Du musst dich entscheiden: Entweder arbeitest du direkt mit der globalen Variable oder aber gibst nur einen Rückgabewert zurück. Wenn du beides machst, bekommst du nur Redundanzen.
Ich rate dir zu letzterem:
PHP:
function rekurs($ar)
{
	$output = '';
	foreach ($ar as $key => $value) {
		if (is_array($value)) {
			$output .= "…";
			$output .= rekurs($value);
		} else {
			$output .= "…";
		}
	}
	return $output;
}

Ok, habe das geändert, funktioniert bestens ...weiss aber immer noch nicht, wo und wie ich "]" & "," anpassen kann :(

Vielen Dank
 
PHP:
function rekurs($ar)
{
	$output = array();
	foreach ($ar as $key => $value) {
		if (is_array($value)) {
			$output[] = "{task:'".$key."',duration:'5',user:'',uiProvider:'col',cls:'master-task',iconCls:'task-folder',children:[" . implode(',', rekurs($value)) . "]}";
		} else {
			$output[] = "{task:'".$key."',duration:'5',user:'Jack Slocum',uiProvider:'col',leaf:true,iconCls:'task'}";
		}
	}
	return $output;
}
PHP:
$output = '[';
$output .= implode(',', rekurs($dir));
$output .= ']';
 
PHP:
function rekurs($ar)
{
	$output = array();
	foreach ($ar as $key => $value) {
		if (is_array($value)) {
			$output[] = "{task:'".$key."',duration:'5',user:'',uiProvider:'col',cls:'master-task',iconCls:'task-folder',children:[" . implode(',', rekurs($value)) . "]}";
		} else {
			$output[] = "{task:'".$key."',duration:'5',user:'Jack Slocum',uiProvider:'col',leaf:true,iconCls:'task'}";
		}
	}
	return $output;
}
PHP:
$output = '[';
$output .= implode(',', rekurs($dir));
$output .= ']';

Oha, der hat gesessen, erstaunlich! Mal schauen ob ich das nachvollziehen kann.
Es klappt bestens, Vielen Dank Senor Gumbo! Sicher kannst Du mir auch sagen, wie ich wieder Lust auf meine Freundin bekomme? ;-)
 
Zuletzt bearbeitet:
Zurück