Zwei Arrays miteinander alignen und den ersten Teil ausgeben

NTDY

Erfahrenes Mitglied
Ich habe zwei Arrays
PHP:
Array1	[1,2,2,10,12,10,6,7,8,9]
Array2	[6,7,8,9,10,11,12]
Die beiden Arrays überlappen sich in [6,7,8,9]
(Ende vom ersten Array und Anfang vom zweiten Array)

Wie kann ich vom ersten Array den ganzen Teil, der nicht überlappt ausgeben lassen?
Gibt es da eine Arrayfunktion oder wie kann der Algorithmus aussehen?
 
Hi

Array3 enthält am Ende den gesuchten Teil von Array1.
Ungetestet.
PHP:
if(count($array1) == 0 || count($array2) == 0) 
    $array3 = $array1; //trivial, keine Überlappung bei leeren Arrays
else
{
    $array3 = array();
    $i = count($array1) - count($array2); //erster möglicher Überlappungsstart in Array1
    if($i < 0) $i = 0;
    for(; $i < count($array1); $i++) //jeden möglichen start von da bis Ende ausprobieren
    {
        for($j = $i; $j < count($array1); $j++) //für diese Startposition bis Ende prüfen, ob alles gleich ist
        {
            if($array1[$j] != $array2[$j - $i]) 
               break;
        }
        if($j >= count($array1)) //wenn ohne break durchgelaufen: Gefunden
        {
             for($j = 0; $j < $i; $j++)
                 $array3[$j] = $array1[$j];
        }
    }
}
 
Ich habe da ad hoc mal was geschrieben:
PHP:
function array_align(array $array1, array $array2) {
  if ( empty( $array1 ) || empty( $array2 ) ) {
    return array_values( $array1 );
  }

  // new indices for arrays
  $array1  = array_values( $array1 );
  $array2  = array_values( $array2 );
  // get positions in array1 of first value in array2
  $indices = array_keys( $array1, $array2[0] );

  if ( empty( $indices ) ) {
    return $array1;
  }

  foreach ( $indices as $index ) {
    $slice1 = array_slice( $array1, $index );
    $slice2 = array_slice( $array2, 0, count( $slice1 ) );

    if ( $slice1 === $slice2 ) {
      return array_slice( $array1, 0, count( $slice1 ) * -1 );
    }
  }

  return $array1;
}
 
Ich schummle aber auch ein bisschen, in dem ich vorher die Schlüssel neu vergebe ;) das kann man bei Deiner Lösung auch noch hinzufügen.
 
Seit mehr als zehn Jahren arbeite ich mit PHP und ich hatte bisher keinen einzigen Fall, in dem ich so eine Funktion brauchte. Insofern sehe ich nicht den allgemeinen Nutzen für so eine Funktion. Es bleibt eine Randerscheinung.
 

Neue Beiträge

Zurück