birbirine iki dizi haritasına zarif yolu

4 Cevap php

Ben iki dizi, kimlikleri ile bir ve İsimler ile bir tane var:

$ids = array(4, 13, 6, 8, 10);
$names = array('alice', 'bob', 'charles', 'david', 'elizabeth');

Ben kimlikleri ile satırlar dizideki adları böylece db güncellemeniz gerekir. Burada zor biraz: Ben de iki İnts var:

$special_name = 2; // the index in $names, in this case we mean 'charles'
$special_id = 13;  // the id value

Ben isim dışında hangi kimliği, gider hangi umurumda değil $special_name $special_id üzerine gitmeli ile isim.

Oraya en zarif yolu nedir? Ben düşünüyorum yöntemlerin tümü oldukça dağınık görünüyor. Ben düşündüm en iyi her diziden özel öğeleri ayıklamak, ve bu ilk yapmak ve sonra belki de bu gibi yeni bir dizi bina, gerisini yapmak için:

$mapped = new array();
$mapped[$special_id] = $names[$special_name];
foreach ($ids as $id) {
    if ($id != $special_id) {
        $mapped[$id] = current($names);
    }
    // advance $names pointer
    $next_name = next($names);
    if ($next_name == $special_name) next($names);
}

Ben henüz (üzereyim) test değil ama böyle bir şey üretmek için bir anlamı:

$mapped = array(13=>'charles', 4=>'alice',6=>'bob', 8=>'david', 10=>'elizabeth');

ve daha sonra asıl güncelleme yapmak için bu geçiyor. Daha iyi bir fikrin var mı?

GÜNCELLEME: Yukarıdaki olası bir çözüm eklendi. Bu arada bir kaç cevapları içeri geldi

4 Cevap

Bu özel Kimlikleri için değildi, sadece array_combine 'iki dizileri d olabilir. Burada sorunu çözmüş düşünüyorum nasıl:

Kurulum

$ids = array(4, 13, 6, 8, 10);
$names = array('alice', 'bob', 'charles', 'david', 'elizabeth');
$specialNameIndex = 2;
$specialId = 13;

Çözüm

  $result = array($specialId => $names[$specialNameIndex]);
  unset($ids[array_search($specialId, $ids)], 
        $names[$specialNameIndex]);
  $result += array_combine($ids, $names);

Sonuç

print_r($result);
Array
(
    [13] => charles
    [4] => alice
    [6] => bob
    [8] => david
    [10] => elizabeth
)

$ Kimlikleri ve $ isimler diziler senkronize edilir? (4 'Alice' uygun mu?)


for ($i=0; $i < count($ids); $i++) {
    $indexed[$ids[$i]] = $names[$i]; // $indexed[4] = 'alice';
    $indexed2[] = array ( $ids[$i] => $names[$i] ); // $indexed[0] = ( 4 => 'alice')
}

Sizin fave almak

Eğer varsayılan dizin kullanmak yana bir kerede iki dizide yineleme böylece dizinleri elde etmek için foreach() keys($ids) üzerinde kullanabilirsiniz. Sadece $ids mevcut indeksi değerini karşılaştırmak ve $names uygun bir alternatif indeksi kullanabilirsiniz.