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?
19 answers
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)
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.
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
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.
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);
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
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]
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
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.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.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
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).
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 .
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+.
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]];
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'
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
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.
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
lubiterable
(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
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.
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