Tek bir diziye birden diziler Interleaving

4 Cevap php

Ben bir tek dizi içine birkaç diziler birleştirmek gerekir. Ben arıyorum ne olduğunu açıklamak için en iyi yolu, tek bir diziye diziler "harmanlayabilmekle" dir.

Örneğin dizi # 1 öğe bir almak ve nihai diziye eklenecek. Dizi # 2 öğeyi bir alın ve nihai diziye eklenecek. Vs ... dizi # 1 öğe iki alın ve ekleme

Nihai dizi bu gibi bir şey olacaktır:

array#1.element#1 array#2.element#1 . . .

"Vurucu" bireysel diziler çeşitli uzunluklarda olabilir.

Kullanmak için iyi bir veri yapısı var mı?

4 Cevap

örneğin,

function array_zip_merge() {
  $output = array();
  // The loop incrementer takes each array out of the loop as it gets emptied by array_shift().
  for ($args = func_get_args(); count($args); $args = array_filter($args)) {
    // &$arg allows array_shift() to change the original.
    foreach ($args as &$arg) {
      $output[] = array_shift($arg);
    }
  }
  return $output;
}

// test

$a = range(1, 10);
$b = range('a', 'f');
$c = range('A', 'B');
echo implode('', array_zip_merge($a, $b, $c)); // prints 1aA2bB3c4d5e6f78910

Diziler yalnızca sayısal tuşları varsa, burada basit bir çözüm var:

$longest = max( count($arr1), count($arr2) );
$final = array();

for ( $i = 0; $i < $longest; $i++ )
{
    if ( isset( $arr1[$i] ) )
        $final[] = $arr1[$i];
    if ( isset( $arr2[$i] ) )
        $final[] = $arr2[$i];
}

Tuşlara adında varsa yerine tuşları dizi boyunca her dizi ve döngü için array_keys işlevini kullanabilirsiniz.

İkiden fazla diziler (veya dizilerin değişken sayısı) istiyorsanız o zaman seni $arr[0] ve $arr[1] gibi olması gerekir diye düşünüyorum ama (iç içe bir döngü kullanmak mümkün olabilir bireysel diziler).

Ben sadece array_merge() kullanmak istiyorsunuz, ama tabii ki tam olarak ne bağlıdır.

Onlar aynı olmayan sayısal anahtar olduğunda elemanları sadece değiştirilmesi olacağını ise, bu, birbirlerine bu dizileri eklemek istiyorum. Ve bu sizin için bir sorun olmayabilir, ya da ilk diziler 'elemanlarının içerikleri daha sonra olanlar tarafından yazılır olacağından, çünkü nitelik düzenin çözülmesi mümkün olabilir.

N diziler varsa, bir SortedList kullanabilirsiniz ve bir sıralama endeksi olarak arrayIndex * n + arrayNumber kullanın.