Ben bir dizide bazı (hepsi değil) elemanları seçin ve PHP ile shuffle miyim?

2 Cevap php

Can I choose some elements in an array and shuffle it in PHP? You know, when you use

shuffle(array)

, Bu dizideki tüm elemanları karıştırır, ama bunu nasıl, değişmeden diğer elemanları tutmak ise sadece bir dizideki bazı unsurları shuffle istiyorum?

2 Cevap

Aşağıdaki düşünün

function swap(&$a, &$b) { list($a, $b) = array($b, $a); }

$len = count($a);
for($i = 0; $i < $len; $i++) {
   $j = rand(1, $len) - 1;
   swap($a[$i], $a[$j]);
}

Bu Tüm dizi öğelerini karıştırır standart döngü. Sadece bazı ("hareketli") elemanları karıştırmak için, en bir diziye kendi anahtarlarını koyalım

$keys = array(1, 3, 5, 7, 9, 11, 13, 17);

ve $ tuşları üzerinde döngü ile $ a üzerinde döngü değiştirin

$len = count($keys);
for($i = 0; $i < $len; $i++) {
   $j = rand(1, $len) - 1;
   swap($a[$keys[$i]], $a[$keys[$j]]);
}

Bu pozisyon 1, 3, 5, vb elementler hareket eder ve yerine başka öğeleri yaprak

Sen kopya shuffle, array_slice shuffle istediğiniz dizinin bölümünü kopyalamak için kullanın ve ardından array_splice, orijinal diziye geri karıştırılan veri kopyalamak için kullanabilirsiniz.

Eğer öğelerin anahtarlarını biliyorsanız EDIT: Daha genel olarak, size, shuffle denilen onları bir diziye koymak istiyorum $keys. Daha sonra:

// Get out the items to shuffle.
$work = array();
foreach ($keys as $i => $key) {
    $work[$i] = $myarray[$key];
}

shuffle($work);  // shuffle them

// And put them back.
foreach ($keys as $i => $key) {
    $myarray[$key] = $work[$i];
}

(Sorry if this has some mistakes; my PHP is rusty and I'm not near a computer where I can test it!)

Çok benzer bir şey çok boyutlu bir dizi için çalışacaktır. Her element $keys endeksleri bir dizi olabilir ve yerine $myarray[$key] Eğer yazardı $myarray[$key[0]][$key[1]].