() array_splice - birleşmeli diziler Sayısal Kaydırmalar

2 Cevap php

2 Cevap

Zaten Just grabbing and unset ting değeri çok daha iyi bir yaklaşımdır (ve muhtemelen çok daha hızlı) , ama, sen sadece birlikte sayabilirsiniz

$result = array();
$idx = 0; // init offset
foreach ($input as $key => $value)
{
    if ($key == 'more')
    {
        // Remove the index "more" from $input and add it to $result.
        $result[] = key(array_splice($input, $idx, 1));
    }
    $idx++; // count offset
}
print_R($result);
print_R($input);

verir

Array
(
    [0] => more
)
Array
(
    [who] => me
    [what] => car
    [when] => today
)

BUT Teknik bir ilişkisel anahtarı konuşan hiçbir sayısal dizin vardır. Girdi dizisi ise

$input = array
(
    'who' => 'me',
    'what' => 'car',
    'more' => 'car',
    'when' => 'today',
    'foo', 'bar', 'baz'
);

sonra dizin 2 "baz" dir. array_slice bir offset, bir sayısal anahtar olarak aynı olmadığı kabul beri ama, öyle ki, (sırayla elemanları görünür) dizideki o pozisyonda bulunan öğesini kullanan neden eser boyunca sayma.

Yerine kimlik eşitliği için test ediyoruz çünkü bir dipnot düşmek, dizideki sayısal tuşları ile, sen, komik sonuçlar elde ediyorum. 'Daha' typecasted önlemek üzere bunun yerine $key === 'more' olun. Ilişkilendirilebilir tuşları benzersiz olduğundan da sonra geri dönebilirler sonraki anahtarlarını kontrol anlamsız olduğu için 'daha fazla', bulundu. Ama gerçekten:

if(array_key_exists('more', $input)) unset($input['more']);

Ben çözüm bulundu:

$offset = array_search('more', array_keys($input)); // 2

Hatta gibi "komik" dizileri ile:

$input = array
(
    'who' => 'me',
    'what' => 'car',
    'more' => 'car',
    'when' => 'today',
    'foo', 'bar', 'baz'
);

Bu:

echo '<pre>';
print_r(array_keys($input));
echo '</pre>';

Doğru bu çıkışlar:

Array
(
    [0] => who
    [1] => what
    [2] => more
    [3] => when
    [4] => 0
    [5] => 1
    [6] => 2
)

Önemsiz bir çözüm ama oraya biraz karanlık var.

Ben herkes tüm yardım için teşekkür ederiz. =)