array_merge problem

seomaniac

Grünschnabel
Guten Abend liebe Comm,

ich habe wiedermal ein kleines Problem und leider komme ich an dieser Stelle nicht weiter.


zu den Gegebenheiten:

ich habe ein Formular für die vorauswahl "multiple"

dort stehen z.b. 5 werte wovon eines aber auch 5 ausgewählt werden können.

nennen wir sie value1 - value5.

diese werden per $_POST übergeben und stehen in einem array.

in der nächsten php habe ich nun schon vordefinierte arrays

PHP:
$value1 = array( 'bla', 'blubb');
$value2 = array( 'blubb', 'kaese');
$value3 = array( 'bla', 'blubb', 'alien');
$value4 = array( 'bla', 'maus');
$value5 = array( 'iltis');

nun möchte ich das die per $_POST übergebenen Werte im bsp. value2 und value4
merged werden.

PHP:
//sieht beispielsweise so aus zur veranschaulichung:

$uebergabe = array('value2', 'value4');
es soll zu
PHP:
$merged = array_merge ($value2, $value4);

hab es bereits mit einer foreach Schleife versucht das $ davor zu bekommen aber das wird dann nicht als Verweiß zu den vorhanden Arrays erkannt.

vielen Dank für Hilfreichen tips.
liebe grüße
 
Bin nun einen anderen weg gegangen und Durchsuche das Array auf Inhalt mit:

codebeispiel falls jemand das selbe problem haben sollte:

PHP:
$merged = array();
	if	   (in_array('a1',$skills)) { $merged = array_merge ($merged, $a1);};
	if	   (in_array('b1',$skills)) { $merged = array_merge ($merged, $b1);};
	if	   (in_array('c1',$skills)) { $merged = array_merge ($merged, $c1);}
	else { }
 
Ich würde dir gerne einen eleganten Weg aufzeigen. Doch sehe ich in deinem Beispiel nicht, wie das Endresultat aussehen soll.
Ebenfalls sehe ich nicht, was bei deiner Lösung eigentlich die Arrays $skilsl und $a1 bis $c1 sind. Passt irgendwie absolut nicht mit deinem ersten Beitrag zusammen.
 
PHP:
if(!isset($_POST['wahl'])){ exit('Bitte eine auswahl Vornehmen'); };

//vordefinierte werte
$vorname = 'testvn';
$name = 'testname';
$plz = 'testplz';
$ort = 'testort';
$str = 'teststraße';
$test = 'test';


//welche auswahl was beinhaltet
$a1 = array( $vorname, $name );
$b1 = array( $vorname, $name, $plz, $ort, $str );
$c1 = array( $vorname, $name, $test );

//zusammenführen
$merged = array();
	if	   (in_array('a1',$wahl)) { $merged = array_merge ($merged, $a1);};
	if	   (in_array('b1',$wahl)) { $merged = array_merge ($merged, $b1);};
	if	   (in_array('c1',$wahl)) { $merged = array_merge ($merged, $c1);}
	else { }
		
//doppelte werte löschen
$short = array_unique ( $merged );

//zum schluss werden mit einer foreach schleife die values untereinander ausgegeben

mir wäre es natürlich lieber wenn ich auf part //zusammenführen verzichten könnte
weil ich immer sobald ich z.b. noch d1 und e1 etc. hinzufüge (was vorkommen wird)
im code immer ein neues if erstellen muss.

lg

/e: obwohl das auch nicht unbedingt ein beinbruch sein wird aber umso mehr dynamik umso besser ;)
 
Zuletzt bearbeitet:
Also
$wahl ist ein Array. Der beinhaltet eine Mehrfachselektion 'a1' bis 'c1'. Anhand von dem zeigst du die Arrays zusammen und reduzierst sie auf die grösste eindeutige Menge.

Hier mal meine generische Lösung. Ich setze die Werte wie auch die Pattern in Arrays. Damit lässt sich einfacher arbeiten.
PHP:
//Testdaten
$wahl = array('a1', 'c1');

//vordefinierte werte
$values = array(
        'vorname'   => 'testvn',
        'name'      => 'testname',
        'plz'       => 'testplz',
        'ort'       => 'testort',
        'str'       => 'teststraße',
        'test'      => 'test');


//welche Auswahl was beinhaltet
$patterns['a1'] = array( 'vorname', 'name' );
$patterns['b1'] = array( 'vorname', 'name', 'plz', 'ort', 'str' );
$patterns['c1'] = array( 'vorname', 'name', 'test' );

//Ab hier müssen auch bei mehr möglichen Werten oder Pattern nix mehr geändert werden.

//Bei jedem Pattern as den Werten Schlüssel machen. Aus dem Index wird ein Wert. 
//Der kann uns aber egal sein. Er wird eh nicht gebraucht
//Resultat:  $patterns['a1'] = array( 'vorname' => 0, 'name' => 1 )
$patterns = array_map('array_flip', $patterns);

//die Patterns gemäss $wahl auswählen
$selectedPatterns = array_intersect_key($patterns, array_flip($wahl));

//Die Patterns zu einer eindeutigen Auswahl zusammenziehen
//Alle PAtterns dem array_merge übergeben. Die Schlüssel bleiben dabei eindeutig
$selection = call_user_func_array('array_merge', $selectedPatterns);

//und die Werte zuweisen. Es werden alle Werte des ersten Arrays übernommen, welche
//übereinstimmende Schlüssel mit dem zweiten Array haben.
$result = array_intersect_key($values, $selection);

var_dump($result);

Ausgabe:
Code:
// Ausgabe für a1 & c1
array(3) {
  ["vorname"]=>
  string(6) "testvn"
  ["name"]=>
  string(8) "testname"
  ["test"]=>
  string(4) "test"
}

//Ausgabe für b1 & c1
array(6) {
  ["vorname"]=>
  string(6) "testvn"
  ["name"]=>
  string(8) "testname"
  ["plz"]=>
  string(7) "testplz"
  ["ort"]=>
  string(7) "testort"
  ["str"]=>
  string(10) "teststraße"
  ["test"]=>
  string(4) "test"
}
 
Oha, sehr ausführlich, dank Dir!
Ich teste es mal und schau mir die php maual an was die Befehle bewirken, bin ja fast noch blutiger Anfänger und da sind mir wiederrum einige neu :)

ich geb dann natürlich Antwort.

Hätte aber direkt noch eine Frage:

wie Verhält es sich wenn z.b. im $wahl array
ein anderer Wert auftaucht oder er nicht gesetzt ist durch z.b. Manipulation der Übergabe?

lg s/m.
 
Das müsste in dieser Zeile sein
PHP:
//die Patterns gemäss $wahl auswählen
$selectedPatterns = array_intersect_key($patterns, array_flip($wahl));

Das Besipiel aus der PHP-Doku
PHP:
$array1 = array('blau' => 1, 'rot'  => 2, 'grün' => 3, 'violett' => 4);
$array2 = array('grün' => 5, 'blau' => 6, 'gelb' => 7, 'türkis'  => 8);
var_dump(array_intersect_key($array1, $array2));
/**
result :
array(2) {
  ["blau"]=>
  int(1)
  ["grün"]=>
  int(3)
})
*/
Wie du siehst, hats auch da in $array2 (in unserem Fall $wahl) Einträge die im ersten Array nict vorhanden sind (Schlüssel gelb und türkis). Sie werden also im ersten Array nicht ausgewählt.
Ergo werden so automatisch alle ungültigen Übergaben ausgefiltert.
 
Zurück