Uzyskać pierwszy klucz w (ewentualnie) tablicy asocjacyjnej?

Jak najlepiej określić pierwszy klucz w tablicy asocjacyjnej? Najpierw pomyślałem, że wystarczy przebić tablicę, a potem natychmiast ją złamać, w ten sposób:

foreach ($an_array as $key => $val) break;

W ten sposób $key zawiera pierwszy klucz, ale wydaje się to nieefektywne. Czy ktoś ma lepsze rozwiązanie?

 658
Author: Blixt, 2009-06-22

19 answers

Możesz użyć reset oraz key:

reset($array);
$first_key = key($array);

Jest zasadniczo taki sam jak Twój początkowy kod, ale z nieco mniejszym obciążeniem i bardziej oczywistym, co się dzieje.

Pamiętaj tylko, aby zadzwonić reset, albo dostaniesz dowolny z kluczy w tablicy. Możesz również użyć end zamiast reset, aby uzyskać ostatni klucz.

Jeśli chcesz, aby klucz otrzymał pierwszą wartość, reset zwraca ją:

$first_value = reset($array);

Jest jeden specjalny przypadek do obejrzenia out for though (więc najpierw sprawdź długość tablicy):

$arr1 = array(false);
$arr2 = array();
var_dump(reset($arr1) === reset($arr2)); // bool(true)
 1163
Author: Blixt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-21 22:34:17

array_keys zwraca tablicę kluczy. Weź pierwsze wejście. Alternatywnie można wywołać reset na tablicy, a następnie key. To drugie podejście jest prawdopodobnie nieco szybsze (nie testowałem tego), ale ma efekt uboczny resetowania wewnętrznego wskaźnika.

 66
Author: troelskn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 18:15:59

Co ciekawe, pętla foreach jest w rzeczywistości najbardziej efektywnym sposobem na to.

Ponieważ OP konkretnie zapytał o efektywność, należy zauważyć, że wszystkie obecne odpowiedzi są w rzeczywistości znacznie mniej skuteczne niż foreach.

Zrobiłem benchmark z php 5.4 i metoda reset/key pointer (akceptowana odpowiedź) wydaje się być około 7 razy wolniejsza niż foreach. Inne podejścia manipulujące całą tablicą (array_keys, array_flip) to oczywiście nawet wolniejsze niż to i stają się znacznie gorsze podczas pracy z dużą tablicą.

Foreach nie jest wcale nieefektywny, możesz go używać!

Edytuj 2015-03-03:

Skrypty Benchmarkowe zostały poproszone, nie mam oryginalnych, ale zrobiłem kilka nowych testów. Tym razem znalazłem foreach tylko około dwa razy szybciej niż reset / klucz. Użyłem tablicy 100 klawiszy i uruchomiłem każdą metodę milion razy, aby uzyskać zauważalną różnicę, oto kod prostego benchmark:

$array = [];
for($i=0; $i < 100; $i++)
    $array["key$i"] = $i;

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    foreach ($array as $firstKey => $firstValue) {
        break;
    }
}
echo "foreach to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstValue = reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key: " . (microtime(true) - $start) . " seconds <br />";


for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstKey = array_keys($array)[0];
}
echo "array_keys to get first key: " . (microtime(true) - $start) . " seconds <br />";

Na moim php 5.5 to wychodzi:

foreach to get first key and value: 0.15501809120178 seconds 
reset+key to get first key and value: 0.29375791549683 seconds 
reset+key to get first key: 0.26421809196472 seconds 
array_keys to get first key: 10.059751987457 seconds

Reset+klucz http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs

 48
Author: Webmut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-03 15:06:50

key($an_array) poda ci pierwszy klucz

Edit per Blixt: należy wywołać reset($array); przed key($an_array), aby zresetować wskaźnik do początku tablicy.

 34
Author: jimyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 18:35:25
list($firstKey) = array_keys($yourArray);
 21
Author: Sergiy Sokolenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-12 13:38:13

Jeśli wydajność nie jest dla ciebie tak ważna, możesz użyć array_keys($yourArray)[0] w PHP 5.4 (i wyższych).

Przykłady:

# 1
$arr = ["my" => "test", "is" => "best"];    
echo array_keys($arr)[0] . "\r\n"; // prints "my"


# 2
$arr = ["test", "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "0"

# 3
$arr = [1 => "test", 2 => "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "1"

Przewaga nad rozwiązaniem:

list($firstKey) = array_keys($yourArray);

Jest to, że można przekazać array_keys($arr)[0] jako parametr funkcji (tj. doSomething(array_keys($arr)[0], $otherParameter)).

HTH

 19
Author: Martin Vseticka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 06:56:19

Możesz spróbować]}

array_keys($data)[0]
 17
Author: Stopper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-28 10:07:26
$myArray = array(
    2 => '3th element',
    4 => 'first element',
    1 => 'second element',
    3 => '4th element'
);
echo min(array_keys($myArray)); // return 1
 11
Author: Hamidreza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-28 07:02:43

Proszę znaleźć:

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys   =   array_keys($yourArray);
echo "Key = ".$keys[0];
Myślę, że to zadziała.
 9
Author: Pupil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 13:43:21

To również może być rozwiązanie.

$first_key = current(array_flip($array));
Przetestowałem go i działa.
 8
Author: Pupil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-28 07:13:54
 $arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
 list($first_key) = each($arr);
 print $first_key;
 // key1
 3
Author: voodoo417,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-24 20:23:28

Aby poprawić rozwiązanie Webmut , dodałem następujące rozwiązanie:

$firstKey = array_keys(array_slice($array, 0, 1, TRUE))[0];

Wyjście dla mnie w PHP 7.1 to:

foreach to get first key and value: 0.048566102981567 seconds 
reset+key to get first key and value: 0.11727809906006 seconds 
reset+key to get first key: 0.11707186698914 seconds 
array_keys to get first key: 0.53917098045349 seconds 
array_slice to get first key: 0.2494580745697 seconds 

Jeśli zrobię to dla tablicy o rozmiarze 10000, to wyniki staną się

foreach to get first key and value: 0.048488140106201 seconds 
reset+key to get first key and value: 0.12659382820129 seconds 
reset+key to get first key: 0.12248802185059 seconds 
array_slice to get first key: 0.25442600250244 seconds 

Metoda array_keys ma czas 30 sekund (tylko z 1000 elementami, czas dla reszty był mniej więcej taki sam, ale metoda array_keys miała około 7,5 sekundy).

 3
Author: PrinsEdje80,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-13 07:59:16

Dla 2018 +

Począwszy od PHP 7.3, istnieje funkcja array_key_first(), która osiąga dokładnie to:

$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array);
echo $firstKey; // 'foo'

Dokumentacja jest dostępna tutaj .

 3
Author: Ivan Augusto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-29 13:50:15

Najlepszy sposób, który zadziałał dla mnie był

array_shift(array_keys($array))

array_keys pobiera tablicę kluczy z tablicy początkowej i array_shift wycina z niej pierwszą wartość elementu. Do tego potrzebujesz PHP 5.4+.

 2
Author: Yuriy Petrovskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-23 17:57:18

To łatwiejszy sposób, jaki kiedykolwiek znalazłem. Szybko i tylko dwie linijki kodu : - D

$keys = array_keys($array);
echo $array[$keys[0]];
 1
Author: Salvi Pascual,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 12:33:53

Jednowierszowy:

$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );

# echos 'key1'
 0
Author: Kohjah Breese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-06 12:44:13

Dzisiaj musiałem wyszukać pierwszy klucz mojej tablicy zwrócony przez żądanie POST. (I zwróć uwagę na numer ID formularza itp.)

Cóż, znalazłem to: zwraca pierwszy klucz tablicy asocjacyjnej w PHP

Http://php.net/key

Zrobiłem to i działa.
    $data = $request->request->all();
    dump($data);
    while ($test = current($data)) {
        dump($test);
        echo key($data).'<br />';die();
        break;
    }

Może to będzie eko 15min innego faceta. CYA.

 0
Author: Roupioz Clement,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 13:46:53

Bardziej uniwersalna i bezpieczna wersja z fallback dla pustej iterowalnej tablicy:

Uwaga: zakładając, że tablica $jest array lub iterable (PHP >=7.1)

$array = [/* ... */]; // my array or iterable

// these lines are a fallback for the case nothing is found
$firstKey = null; // null or default value of your choice
$firstValue = null; // null or default value of your choice

// iterating the array
foreach ($array as $firstKey => $firstValue) {
    // stop after first iteration
    break;
}

TLDR: w ten sposób nie musisz dwukrotnie sprawdzać iterowalnych. (array w tym przypadku).

Foreach to najszybszy sposób na iterację nad wszystkim.

Zalecenia i wyjaśnienia: Zalecam ustawienie domyślnych wartości dla $firstKey i $firstValue przed iteracją, tylko po to, aby wiedzieć, czy tablica była pusta lub nie.

Uwaga: jeśli zależy ci na tym, aby tablica była zawsze wypełniona, nie ma potrzeby stosowania wartości domyślnych. (ale bądź tego w 100% pewien!)

Wyjaśnienie bardziej zaawansowanych rzeczy:

Jeśli twój iterable ma własny Iterator, może być konieczne zresetowanie go ręcznie po instrukcji foreach.

Więcej o PHP: iterables

 -1
Author: Gabi Dj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-01 15:04:25

Możesz grać ze swoją tablicą

$daysArray = array('Monday', 'Tuesday', 'Sunday');
$day = current($transport); // $day = 'Monday';
$day = next($transport);    // $day = 'Tuesday';
$day = current($transport); // $day = 'Tuesday';
$day = prev($transport);    // $day = 'Monday';
$day = end($transport);     // $day = 'Sunday';
$day = current($transport); // $day = 'Sunday';

Aby uzyskać pierwszy element tablicy możesz użyć current A Dla ostatniego elementu możesz użyć end

Edit

Tylko ze względu na to, aby nie uzyskać więcej głosów w dół dla odpowiedzi można przekonwertować klucz do wartości za pomocą array_keys i użyć jak pokazano powyżej.

 -1
Author: Priyank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-23 06:27:08