Array zusammenfassen, vergleichen und erweitern

BQM

Grünschnabel
Hallo,

ich habe hier ein für mich unlösbares Problem und würde mich riesig freuen, wenn mir jemand helfen könnte.

Die Ausgangssituation sind 2 Arrays (sind immer gleich lang) z.B.

$array1 = 5|6|2
$array2 = 7|3|4

diese sollen grundlegend so zusammengefasst werden:

$new_array = 5|7|6|3|2|4

jetzt kommt aber die Schwierigkeit, es soll noch verglichen und evtl. ergänzt werden. Das müsste jetzt wahrscheinlich in einer Schleife stehen und ungefähr so aussehen:


if((!$array1 == $array2) && ($array2 < 13)){

if($array1 < $array2){

dann nimm $array1, also 5, zähle bis $array2, also 7 und ergänze den $new_array um die fehlende Zahl 6

$new_array = 5|6,7 |6|3|2|4​

}elseif($array1 > $array2){

dann nimm $array1, also 6, zähle bis 12 + zähle bis $array2, also 3 und ergänze den $new_array um die fehlenden Zahlen 7,8,9,10,11,12,1,2

$new_array = 5|6,7 | 6|7,8,9,10,11,12,1,2,3 |2|4​
}​

}​

ich hoffe ich hab's einigermaßen verständlich erklärt, ich versuch schon seit Stunden hier weiter zu kommen, leider ohne Erfolg und wäre für jede Hilfe dankbar.
 
Was du vor hast, ist mir klar, aber wie soll das neue Array dann aussehen? So wie bei dir im Pseudocode? Spich die Zahl aus Array 1 in einem Feld, dann die Zahl aus Array 2 ergänz durch die fehlenden Zahlen durch Komma getrennt in das nächste Feld? Oder soll jede Zahl einem Feld entsprechen?


Edit:
Dies würde deinem Pseudocode entsprechen:
PHP:
$arr1 = array(5, 6, 2);
$arr2 = array(7, 3, 4);
$arrRes = array();

$arrLen = count($arr1);
for($i = 0, $j = 0; $i < $arrLen; $i++)
{
	$arrRes[] = $arr1[$i];
	$tmp = array();
	
	if($arr1[$i] > $arr2[$i])
	{
		for($k = $arr1[$i] + 1; $k != $arr2[$i]; $k++)
		{
			$tmp[] = $k;
			
			if($k == 12)
				$k = 0;
		}
	}
	elseif($arr1[$i] < $arr2[$i])
	{
		for($k = $arr1[$i] + 1; $k < $arr2[$i]; $k++)
		{
			$tmp[] = $k;
		}
	}
	
	$tmp[] = $arr2[$i];
	
	$arrRes[] = implode(',', $tmp);
}

var_dump($arrRes);
Nur schnell hingecodet, daher keine Garantie auf Richtigkeit ;)

Für den Fall, dass jede Zahl ein Feld belegen soll, musst du nur $tmp mit $arrRes ersetzten und $tmp = array() sowie die Zeile mit dem implode() rauswerfen.
 
Zuletzt bearbeitet:
Hallo,

erst einmal vielen Dank für die schnelle Hilfe!

Das funktioniert soweit schon einmal super, allerdings übernimmt er nur die Array's des ersten Artikels.

Wenn ich im 1. Artikel jetzt Februar - April wähle, steht in der DB 2|3,4 – was super ist!
Hab ich einen 2. Artikel und wähle wiederum Februar - April, steht in der DB 2|3,4 hier sollte jetzt aber 2|3,4|2|3,4 stehen.


Ich hab's noch mal etwas ausführlicher beschrieben.


Also ich habe eine Seite, wo man Text-Artikel anlegen kann. Jeder Artikel hat ein Input-Feld für den Titel, eine Textarea für die Beschreibung sowie 2 Select-Felder, wo man zum einen den Monat auswählen kann, ab wann der Artikel angezeigt wird, und zum anderen den Monat auswählen kann, bis wann der Artikel angezeigt werden soll. Es sind also 4 Arrays

$titel = Titel Artikel 1
$description = Beschreibung Artikel 1
$monat_beginn = Monat Anfang Artikel 1
$monat_ende = Monat Ende Artikel 1

Diese "Artikel" befinden sich in einer Schleife. Über einen Button kann man nun neue Artikel hinzufügen und die Array's erweitern sich dementsprechend

$titel = Titel Artikel 1 | Titel Artikel 2
$description = Beschreibung Artikel 1 | Beschreibung Artikel 2
$monat_beginn = Monat Anfang Artikel 1 | Monat Anfang Artikel 2
$monat_ende = Monat Ende Artikel 1 | Monat Ende Artikel 2

So, und nun möchte ich die Array's $monat_beginn und $monat_ende zusammenfügen, das sollte dann so aussehen:

$monat_zusammen = Monat Anfang Artikel 1 | Monat Ende Artikel 1 | Monat Anfang Artikel 2 | Monat Ende Artikel 2

Was jetzt natürlich noch fehlt sind die dazwischen liegenden Monate. Die Monate stehen in der SQL-DB und haben ID's von 1-12. Hat man jetzt z.B. für den 1. Artikel die "Anzeige-Monate" Februar bis Juli gewählt, müsste sich der Array $monat_zusammen entsprechend erweitern

$monat_zusammen = Februar Anfang Artikel 1 | März Art.1, April Art.1, Mai Art.1, Juni Art.1, Juli Ende Artikel 1 | Monat Anfang Artikel 2 | Monat Ende Artikel 2

Zur besseren Übersicht hier mit den ID's

$monat_zusammen = 2| 3, 4, 5, 6, 7 | Monat Anfang Artikel 2 | Monat Ende Artikel 2

ich hoffe, hab's jetzt etwas klarer erklärt.

Viele Grüße
BQM
 
Wo ist nun das Problem? Du wendest den Code für jeden Artikel an und verbindest die Ergebnisse. Da die Ergebnisse untereinander nicht irgendwie vermischt werden, sehe ich absolut kein Problem darin, einfach die Ergebniss-Arrays aneinander zu hängen bzw die Strings (wie sie später in der DB stehen werden) zu Verknüpfen.

Viel mehr stellt sich mir die Frage, ob du es dir nicht viel zu umständlich machst bzw. was du überhaupt erreichen willst.
 
Eine klar strukturierte Use-Case-Beschreibung wäre schon mal hilfreich!

Es gibt also zwei Arrays mit Zahlen von 1-12.
Es soll von der kleinsten Zahl beider Arrays bis zur größten Zahl der beiden hochgezählt werden.
Die Zahlen aus dem Array mit der größeren Zahl sollen nochmals hinzugefügt werden.

Richtig?

PHP:
$a = array_sort($erste_eingabe); // falls unsortiert
$b = array_sort($zweite_eingabe); // falls unsortiert

$ausgabe = array_fill($a[0], $b[count($b) - 1]);
$augabe = array_merge($ausgabe, $b);
 
Zuletzt bearbeitet:
Irgnedwie macht die Speicherart keinen Sinn. Nunja, wenn du unbedingt willst
PHP:
<?php
//Testdaten
$from = Array(2, 3);
$to = Array(4, 6);

//Range erstellen (2-Dimensionaler Array array[x][0] = from, array[ c][1] = to) 
//array {[0]=> array{[0]=> 2, [1]=> 4}, [1]=> array{[0]=> 3, [1]=> 6}}
$ranges = array_map(create_function('$n, $m', 'return array($n, $m);'), $from, $to);

foreach($ranges as $range){
    $result[] = $range[0];
    $result[] = implode(', ', range($range[0]+1, $range[1])); 
}

var_dump($result);
?>
Ergibt
Code:
array(4) {
  [0]=>
  int(2)
  [1]=>
  string(4) "3, 4"
  [2]=>
  int(3)
  [3]=>
  string(7) "4, 5, 6"
}
 
Zurück