Bir dizinin son anahtarını nasıl alabilirim?
Bir dizinin son anahtarını nasıl alabilirim?
Yanıtlar:
Bir çözüm endve (alıntı) kombinasyonu kullanmak olacaktır :key
end() dizinin iç işaretçisini son öğeye ilerletir ve değerini döndürür. key() geçerli dizi konumunun dizin öğesini döndürür. Yani, bunun gibi bir kod hile yapmalıdır:
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
end($array); // move the internal pointer to the end of the array
$key = key($array); // fetches the key of the element pointed to by the internal pointer
var_dump($key);
Çıktı olacak:
string 'last' (length=4)
yani dizimin son elemanının anahtarı.
Bu yapıldıktan sonra dizinin dahili işaretçisi dizinin sonunda olacaktır. Yorumlarda belirtildiği gibi reset(), işaretçiyi dizinin başına getirmek için dizide çalıştırmak isteyebilirsiniz .
reset()) ;; ama yararlı olabilecek bu işlevi göstermekte haklısınız.
array('a', 'b', 'c', 'd', 'a')4 yerine 0 anahtarını döndürür.
Her ne kadar end()kolay gibi görünüyor, bu hızlı değil. Daha hızlı ve daha güçlü alternatif array_slice():
$lastKey = key(array_slice($array, -1, 1, true));
Testlerin söylediği gibi , 500000 elemanlı bir dizide neredeyse 7 kat daha hızlı!
end($arr);$key = key($arr);reset($arr);yı (b) ile karşılaştırarak $key = key(array_slice($arr,-1,1,true));... end()ÇOK daha hızlı olmasına neden oldu ! end () = 0.05326 saniye, array_slice = 8.506 saniye ... ha ??
end()en hızlı çünkü çok basit bir C fonksiyonundan türetilebilir, örneğin:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
lastson öğeye dahili bir işaretçisi olduğuna inanıyorum . Hemen end()hemen O (1) yapmak. :-)
tercih ederim
end(array_keys($myarr))
end((array_keys($myarr)))Bildirimde gezinmek için kullanabilirsiniz .
PHP 7.3 (2018) 'den beri bunun için (nihayet) bir işlev vardır: http://php.net/manual/en/function.array-key-last.php
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )
çıktı olacak
orange
Sadece kullan : echo $array[count($array) - 1];
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }hangi olduğunu öğrendim zaman bütçesinde olduğunuzda ilginç ama iş için iyi değil
$a[1] = 1; $a[5] = 5; $a[0] = 0;, o sırayla (1, 5, 0) tuşlarına sahip bir diziniz olacaktır. count($a)3 verir ve $a[2]tanımlanmaz. Kesinlikle size 5 geri vermiyor.
Bunun daha hızlı olup olmayacağını bilmiyorum, ama bu şekilde yapmak daha kolay görünüyor ve bitirmek için bir işlevden geçerek () ...
sadece bir değişkene ihtiyacı vardı ... bir kod satırı daha yazmak için büyük bir anlaşma değil, sonra gerekiyorsa ayarını kaldırın.
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
PHP7.3'ten itibaren array_key_last () ile bir dizideki (dış seviye) son anahtara doğrudan erişebilirsiniz.
Kesinlikle bu sayfadaki tartışmanın çoğunu yatağa koyar. En iyi performansı gösteren, hiçbir yan etkisi olmayan ve bu sorunun tam olarak aradığı şeyi iletmek için doğrudan, sezgisel, tek çağrı tekniğidir.
Kanıt olarak kabaca bir kıyaslama: https://3v4l.org/hO1Yf
array_slice() + key(): 1.4 end() + key(): 13.7 array_key_last(): 0.00015* Test dizisi 500000 element içerir, mikrotime 100x tekrarlanır, ardından ortalaması alınır ve bilimsel gösterimi önlemek için 1000 ile çarpılır. İlk test için @Mhithitgarha'ya @ TadejMagajna'nın cevabı altında yorum yaptı .
Bu, son anahtarın değerini aşağıdakiler olmadan alabileceğiniz anlamına gelir:
Bu işlev gecikmişti ve dizi işlev aracı kayışına performansı artıran, istenmeyen yan etkileri önleyen ve temiz / doğrudan / sezgisel kod sağlayan hoş bir eklentiydi.
İşte bir demo :
$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
echo "please upgrade to php7.3";
} else {
echo "First Key: " , key($array) , "\n";
echo "Last Key: " , array_key_last($array) , "\n";
next($array); // move array pointer to second element
echo "Second Key: " , key($array) , "\n";
echo "Still Last Key: " , array_key_last($array);
}
Çıktı:
First Key: a
Last Key: c // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c // <-- unaffected by the pointer position, NICE!
Bazı notlar:
array_key_last()array_key_first () öğesinin kardeş işlevidir .nullDizi boşsa .array_value_first()& array_value_last()) de, kitap ucu öğelerine işaretçi-cahil erişim sunacaktı, ancak açık bir şekilde hayata geçmek için yeterli oy toplayamadılar.İşte yeni özellikleri tartışan alakalı sayfalar:
ps Eğer birisi diğer tekniklerden bazılarını tartıyorsa, bu küçük karşılaştırma koleksiyonuna başvurabilirsiniz: ( Demo )
Duration of array_slice() + key(): 0.35353660583496 Duration of end() + key(): 6.7495584487915 Duration of array_key_last(): 0.00025749206542969 Duration of array_keys() + end(): 7.6123380661011 Duration of array_reverse() + key(): 6.7875385284424 Duration of array_slice() + foreach(): 0.28870105743408
Array_pop ve array_keys işlevini aşağıdaki gibi kullanmayı deneyin :
<?php
$array = array(
'one' => 1,
'two' => 2,
'three' => 3
);
echo array_pop(array_keys($array)); // prints three
?>
array_pop()dönüş değeri ile çalışır array_keys()ve olmayan orijinal dizi.
PHP'den itibaren> = 7.3 array_key_last(), bir dizinin son anahtarını almanın en iyi yoludur. Bir dizinin son anahtarını almak için end(), key()ve reset()sadece kombinasyonunu kullanmak çirkin.
$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3
ile karşılaştır
end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)
end()Ve kombinasyonlarını kullanıyorsanız işaretçinin başında olması için diziyi sıfırlamanız gerekir.key()
Ayrıca bu soruna alternatif bir çözüm sunmak istiyorum.
Tüm anahtarlarınızın boşluk olmadan sayısal olduğu varsayılırsa, tercih ettiğim yöntem diziyi daha sonra bu değerden eksi 1 saymaktır (dizi anahtarlarının 0'dan başlaması gerçeğini hesaba katmak).
$array = array(0=>'dog', 1=>'cat');
$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];
var_dump($lastKey);
print_r($lastKeyValue);
Bu size:
int (1) kedi
Bunu kullanabilirsiniz:
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array);
echo key($array);
Başka bir Çözüm, bir işlev oluşturmak ve kullanmaktır:
function endKey($array){
end($array);
return key($array);
}
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
Bunu ile deneyin array_reverse().
$arr = array(
'first' => 01,
'second' => 10,
'third' => 20,
);
$key = key(array_reverse($arr));
var_dump($key);
$array = array(
'something' => array(1,2,3),
'somethingelse' => array(1,2,3,4)
);
$last_value = end($array);
$last_key = key($array); // 'somethingelse'
PHP, dizi işaretçisini $ dizi için dahili olarak taşıdığı için çalışır
Satır içi de kullanılabilecek mümkün olan en iyi çözüm:
end($arr) && false ?: key($arr)
Bu çözüm yalnızca ifade / deyimdir ve iyi olanın mümkün olan en iyi performans olmadığını gösterir.
Çizgisel örnek kullanımı:
$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
GÜNCELLEME: PHP 7.3 ve sonraki sürümlerinde: (tabii ki) yeni eklenen array_key_last()yöntemi kullanın.