Ilişkisel dizi anahtarları gruplama - aynı sırayla

1 Cevap php

Ben şu 2 diziler var ve bunları birleştirmek istiyorum. Ben onların değerlerine göre tuşları daha çok ilgileniyorum. Ben bu almak istiyorum

$arr1 = array(
  'tom' => "1", 
  'sally' => "20"   // unique
  'larry' => "2", 
  'kate' => "3",
  'dave' => "23"    //unique
);

$arr2 = array(
  'tom' => "11", 
  'larry' => "12", 
  'drummer' => "2", // unique
  'kate' => "7",
  'nick' => "3"     //unique
);

ve böyle bir şey çevirmek

$arr = array(
  'tom',
  'sally',     //unique from arr1, ended up here because she's before larry
  'drummer',   //unique from arr2, ended up here because he's after larry
  'larry', 
  'kate',
  'dave',     //unique from arr1, ended up here because he's after the last 2 similar
  'nick'      //unique from arr2, ended up here because he's after the last 2 similar
);

The trick is I need to insert anything that's unique in the right spot/order based on what's before/after it. Thanks

1 Cevap

Genellikle ne istediğinizi, önemsiz olmayan bir algoritma. Bu sekans eşleşen veya longest common subsequence problem denir. Bunu hesaplamak için yerleşik bir PHP işlevi olduğunu sanmıyorum. Eğer maçları var sonra, aralarındaki eşsiz öğeleri işleyebilir. Sadece orada çok yaygın dizilerin olabilir, böylece tüm öğeler orijinal dizilerde olduğu gibi aynı sırada olması için gerçekten birleştirme bu tür istiyorsanız, her zaman mümkün olmayacağını unutmayın.

Mümkün olan en iyi sonucu ihtiyacınız yoksa, sen açgözlülükle 4 sonraki öğeleri içinde maçlar arıyor ki, böyle bir yaklaşım deneyebilirsiniz:

$result = array();

$i = 0;
$j = 0;
while ($i < count($arr1)) {
    // Look for a matching item in the next four items of $arr2
    $k = 0;
    while ($k < 4) {
        // Do we have a match?
        if ($arr1[$i] == $arr2[$j+$k]) {
            // Add items from $arr2 that are before the matching item
            while ($k-- > 0) {
                $result[] = $arr2[$j];
                $j++;
            }
            $j++;
            break;
        }
        $k++;
    }
    // Add the current item fro $arr1
    $result[] = $arr1[$i];
    $i++;
}
// Add the remaining items from $arr2
while ($j < count($arr2)) {
    $result[] = $arr2[$j];
    $j++;
}

$result = array_unique($result);