Sayısal tuşları numaralandırılmadan iken bir diziden değerlerini kaldırmak için nasıl

5 Cevap php

Ben sayısal veya ilişkilendirilebilir tuşları, ya da her ikisini de içerebilir bir dizi var:

$x = array('a', 'b', 'c', 'foo' => 'bar', 'd', 'e');
print_r($x);
/*(
    [0] => a
    [1] => b
    [2] => c
    [foo] => bar
    [3] => d
    [4] => e
)*/

Ben sıralı tutmak için ilişkisel olmayan tuşları numaralandırılmadan, diziden bir öğeyi kaldırmak için mümkün istiyorum:

$x = remove($x, "c");
print_r($x);
/* desired output:
(
    [0] => a
    [1] => b
    [foo] => bar
    [2] => d
    [3] => e
)*/

Kaldırmak için doğru elemanı bulma hiçbir sorunu, bu sorun tuşları bulunuyor. unset tuşlarını yeniden numaralandırmak etmez ve array_splice bir offset, yerine bir anahtar daha (yani çalışır: ilk örnekte $ x almak, {[ (3)]} "bar" unsuru yerine "d" eleman) kaldırmak istiyorsunuz.

5 Cevap

Dize anahtarlarını koruyarak bu diziyi yeniden endekslemek olmalıdır:

$x = array_merge($x);

Bir sonraki ELEGANT çözümü ile fixet yapabilirsiniz:

Örneğin:

<?php

$array = array (
    1 => 'A',
    2 => 'B',
    3 => 'C'
);

unset($array[2]);

/* $array is now:
Array (
    1 => 'A',
    3 => 'C'
);
As you can see, the index '2' is missing from the array. 
*/

// SOLUTION:
$array = array_values($array);

/* $array is now:
Array (
    0 => 'A',
    1 => 'C'
);
As you can see, the index begins from zero. 
*/
?>

Ben bu ile geldim - Ben iyi ise emin değilim ama:

// given: $arr is the array
//        $item is the item to remove

$key = array_search($item, $arr);  // the key we need to remove
$arrKeys = array_keys($arr);
$keyPos = array_search($key, $arrKeys); // the offset of the item in the array

unset($arr[$key]);
array_splice($arrKeys, $keyPos, 1);

for ($i = $keyPos; $i < count($arrKeys); ++$i) {
    if (is_int($arrKeys[$i])) --$arrKeys[$i]; // shift numeric keys back one
}
$arr = array_combine($arrKeys, $arr);  // recombine the keys and values.

Ben sadece kısalık uğruna, dışarı bıraktım bir kaç şey var. Eğer kaldırma konum anahtarı yukarıdaki kodu kullanarak önce bir dize olup olmadığını Örneğin, ayrıca dizi birleşmeli olup olmadığını kontrol edin, ve istiyorum.

Try array_diff() it may not order the new array correctly though if not the following should work

Sen kaldır işlevi üzerinde yineleme gerekir.

function remove($x,$r){
 $c = 0;
 $a = array();
 foreach ($x as $k=>$v){
   if ($v != $r) {
     if (is_int($k)) {
       $a[$c] = $v;
       $c++;
     }
     else {
       $a[$k] = $v;
     }
   } 
 }
 return $a;
}

DC

Ben bu sorun için zarif bir çözüm olduğunu sanmıyorum, muhtemelen diziye döngü gerekiyor ve kendiniz tuşlarını yeniden düzenlemek.