İlişkili bir PHP dizisinden ilk öğe nasıl elde edilir?


154

Şöyle bir dizim olsaydı:

$array['foo'] = 400;
$array['bar'] = 'xyz';

Ve anahtarını bilmeden o diziden ilk öğeyi çıkarmak istedim, bunu nasıl yapacağım? Bunun için bir işlev var mı?


Yanıtlar:



58

#PHP <7.3

Eğer dizinin hakkında yeterli bilmiyorsanız (eğer emin ilk anahtar olup olmadığını konum foo veya çubuk daha sonra dizi de ayrıca olmak, belki, belki) boşaltın .

Bu nedenle, özellikle döndürülen değerin boolean YANLIŞ olma ihtimali varsa, kontrol etmek en iyisidir:

$value = empty($arr) ? $default : reset($arr);

Yukarıdaki kod kullanır resetve dolayısıyla yan etkileri vardır (dizinin dahili işaretçisini sıfırlar), bu nedenle dizinin array_sliceilk öğesinin bir kopyasına hızlı bir şekilde erişmek için kullanmayı tercih edebilirsiniz :

$value = $default;
foreach(array_slice($arr, 0, 1) as $value);

Hem anahtarı hem de değeri ayrı ayrı almak istediğinizi varsayarsak , dördüncü parametreyi aşağıdakilere eklemeniz gerekir array_slice:

foreach(array_slice($arr, 0, 1, true) as $key => $value);

İlk öğeyi çift ​​olarak almak için ( key => value):

$item = array_slice($arr, 0, 1, true);

Son öğeyi, anahtarı ve değeri ayrı ayrı almak için basit değişiklik :

foreach(array_slice($arr, -1, 1, true) as $key => $value);

#verim

Dizi gerçekten büyük değilse, aslında ihtiyacınız yoktur array_sliceve tüm anahtar dizisinin bir kopyasını alabilir, ardından ilk öğeyi alabilirsiniz:

$key = count($arr) ? array_keys($arr)[0] : null;

Yine de çok büyük bir diziniz varsa, çağrı çok array_keysdaha fazla zaman ve bellek gerektirecektir array_slice(her iki işlev de dizide yürür, ancak ikincisi gerekli sayıda öğeyi topladığında sona erer - ki bu birdir).

Dikkate değer bir istisna, çok büyük ve kıvrımlı bir nesneye işaret eden ilk anahtara sahip olmanızdır. Bu durumda array_slice, ilk büyük nesneyi kopyalarken array_keysyalnızca anahtarları alır.

#PHP 7.3+

PHP 7.3 itibaren uygular array_key_first()yanı sıra array_key_last(). Bunlar, bir yan etki olarak dizinin dahili durumunu sıfırlamadan ilk ve son anahtarlara verimli bir şekilde erişmek için açıkça sağlanır.

Yani PHP 7.3 ilk beri değer arasında $arrayolan erişilebilir

$array[array_key_first($array)];

Yine de dizinin boş olmadığını kontrol etseniz iyi olur, yoksa bir hata alırsınız:

$firstKey = array_key_first($array);
if (null === $firstKey) {
    $value = "Array is empty"; // An error should be handled here
} else {
    $value = $array[$firstKey];
}

@AhmedShefeer iyi, diğer cevap sadece kabul edilen değil, sekiz yıldır orada . Burada kırıntıları topluyorum: -D. Ama güven oyu için teşekkürler!
LSerni

1
Bana öyle geliyor ki bu en iyi cevap, çünkü hem anahtarı hem de değeri veren diğer tek kullanımdan kaldırılmış cevap, garip olan iptal edilmiş foreach döngüsü. Diğer cevaplar sadece anahtarsız değeri verir.
sootsnoot

1
bunu sevdim ve modern yaklaşımı zamanla güncelledi.
sanjeet bisht

@LSerni Hala aktif olup olmadığınızı bilmiyorum, ancak takılı kaldım ve bu iyi açıklanan ve güncellenen yazı beni kurtardı. Teşekkür ederim
izk

@izk Ben her zaman aktifim! :-D
LSerni

44

İlk yinelemede kırılan sahte döngü:

$key = $value = NULL;
foreach ($array as $key => $value) {
    break;
}

echo "$key = $value\n";

Veya şunu kullanın each()( uyarı: PHP 7.2.0'dan itibaren kullanımdan kaldırılmıştır ):

reset($array);
list($key, $value) = each($array);

echo "$key = $value\n";

2
Muhtemelen reset () daha basit olduğu için.
mjs

1
Çünkü çözüm, kodunuzun ilk satırında ama tamamen gereksiz başka bir satır yazmaya devam ediyorsunuz.
markus

21
sıfırlama anahtarı iade
etmeyecek

3
'Sahte döngü' için +1. Her öğenin üzerinden geçmeden ilk öğelerin anahtarını ve değerini almam gerekiyordu. reset()İşlevi yalnızca ilk değerini almak istiyorum.
Phil Cross

2
Sahte döngü için de +1, anahtarı
tutmam

25

Birkaç seçenek var. array_shift()ilk öğeyi döndürür, ancak aynı zamanda diziden ilk öğeyi kaldırır.

$first = array_shift($array);

current() varsayılan olarak ilk öğe olan dahili bellek işaretçisinin işaret ettiği dizinin değerini döndürür.

$first = current($array);

İlk öğeye işaret ettiğinden emin olmak istiyorsanız, her zaman kullanabilirsiniz reset().

reset($array);
$first = current($array);

3
Bu cevabı en eksiksiz olarak beğeniyorum, ancak not reset()aslında öğeyi döndürüyor, bu nedenle a ile onu takiben $first = current($array)gereksiz.
Tom Auger

9

Sırf başka seçeneklerimiz olması için: reset($arr);dizi işaretçisini yerinde tutmaya çalışmıyorsanız yeterince iyi ve çok büyük dizilerle minimum miktarda ek yük getirir. Bununla ilgili bazı sorunlar var dedi:

$arr = array(1,2);
current($arr); // 1
next($arr);    // 2
current($arr); // 2
reset($arr);   // 1
current($arr); // 1 !This was 2 before! We've changed the array's pointer.

İşaretçiyi değiştirmeden bunu yapmanın yolu:

$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));

Bunun yararı $arr[reset(array_keys($arr))];, dizi gerçekten boşsa bir uyarı oluşturmasıdır.


çok açıklayıcı bir cevap ve diğerleri için çok şey ifade ediyor. Teşekkürler dostum.
Jigar7521

7

bunu yapmanın başka bir kolay ve basit yolu, array_values

array_values($array)[0]

reset()dizi boşsa yanlış döndürdüğü için çok daha iyi bir seçenektir. çözümünüz örneğin soruda işe yaramayacak
Northys

1
PHP 7+ array_values($array)[0] ?? FALSE
sürümünde

4

İlk öğeyi almadan önce değişkenin bir dizi olup olmadığını test edin. Diziyi dinamik olarak oluştururken, null olarak ayarlanmışsa bir hata alırsınız.

Örneğin:

if(is_array($array))
{
  reset($array);
  $first = key($array);
}

3

Biz yapabiliriz $first = reset($array);

Onun yerine

reset($array);
$first = current($array);

Gibi reset()

sıfırlamadan sonra dizinin ilk öğesini döndürür;


2

Yapabilirsin:

$values = array_values($array);
echo $values[0];

2

Bunun gibi anahtarını bilmeden o diziden ilk öğeyi almak için reset () işlevini kullanın.

$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);

çıktı // 400


2

Bunu deneyebilirsin.

Dizinin ilk değerini almak için: -

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   var_dump(current($large_array));
?>

Dizinin ilk anahtarını almak için

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   $large_array_keys = array_keys($large_array);
   var_dump(array_shift($large_array_keys));
?>


1

Bunu ilk ve son değeri elde etmek için yapıyorum. Bu da daha fazla değerle çalışır.

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz

Bu, yalnızca dahili işaretçi ilk öğede olduğunda çalışır. Bu, işaretçinin konumunu sıfırlamadığı için iyi olsa da, yalnızca işaretçi zaten hareketsizken çalışır.
cjc

1

PHP 7.3.0'dan başlayarak , dahili işaretçiyi sıfırlamadan yapmak mümkündür. Kullanırdın array_key_first. Dizinizin içinde değerlere sahip olduğundan eminseniz, şunları yapabilirsiniz:

$first = $array[array_key_first($array)];

Daha büyük olasılıkla, dizinin boş olduğu durumu ele almak isteyeceksiniz:

$first = (empty($array)) ? $default : $array[array_key_first($array)];

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.