Array irgendwie zusammenführen

07/06/2013 - 19:05 von Stefan Mayer | Report spam
Hallo liebe Leute,

ich würde gerne ein Array, wie folgt, auflösen in ein neues array das
die möglichen Kombinationen enthàlt die daraus entstehen können wenn
jeder Wert einmal dabei sein soll.

$ausgangslage = array(
array (
'blau',
'grün',
),
array (
'dick',
'dünn'
),
array(
'lang',
'kurz'
)
);

Die Anzahl der Arrays bzw. Werte können unterschiedlich sein.

Aussehen sollte es so. Also Jede Zeile eine mögliche Kombination

$zielvorstellung = array(
array('blau','dick','lang'),
array('blau','dick','kurz'),
array('blau','dünn','lang'),
array('blau','dünn','kurz'),
array('grün','dick','lang'),
array('grün','dick','kurz'),
array('grün','dünn','lang'),
array('grün','dünn','kurz'),
);

Leider hab ich grad keine Idee wie das funktionieren könnte und wàre für
jeden Tip danke.

Mercy.

adios, Stefan
 

Lesen sie die antworten

#1 Christoph Becker
07/06/2013 - 21:17 | Warnen spam
Stefan Mayer wrote:
ich würde gerne ein Array, wie folgt, auflösen in ein neues array das
die möglichen Kombinationen enthàlt die daraus entstehen können wenn
jeder Wert einmal dabei sein soll.
[...]
Leider hab ich grad keine Idee wie das funktionieren könnte und wàre
für jeden Tip danke.



Wàre count($ausgangslage)==2, dann wàre die Aufgabe sehr einfach zu
lösen, indem man zwei foreach Schleifen ineinander schachtelt, und die
Werte der beiden kombiniert:

function kombinationen()
{
$kombinationen = array();
foreach ($ausgangslage[0] as $wert1) {
foreach ($ausgangslage[1] as $wert2) {
$kombinationen[] = array($wert1, $wert2);
}
}
return $kombinationen;
}

Für den Fall, dass count($ausgangslage) > 2 ist, macht man sich die
Rekursion zunutze, indem man die innere foreach Schleife mit dem
Ergebnis von kombinationen() für das um 1 Element gekürzte Array füttert.

function kombinationen($array)
{
$kombinationen = array();
$tupel = array_shift($array);
foreach ($tupel as $wert1) {
if (count($array) == 1) {
foreach ($array[0] as $wert2) {
$kombinationen[] = array($wert1, $wert2);
}
} else {
foreach (kombinationen($array) as $wert2) {
$kombinationen[] = array_merge(
array($wert1), $wert2
);
}
}
}
return $kombinationen;
}

Die Funktion ist so wie sie ist weder sicher (z.B. Arrays mit weniger
als 2 Elementen werden nicht korrekt behandelt) noch effizient (statt
Arrays sollten eigentlich Listen verwendet werden).

Christoph M. Becker

Ähnliche fragen