2024 日本 PHP 研討會

array_keys

(PHP 4, PHP 5, PHP 7, PHP 8)

array_keys傳回陣列的所有鍵或鍵的子集

說明

array_keys(陣列 $array): 陣列
array_keys(陣列 $array, 混合 $filter_value, 布林 $strict = false): 陣列

array_keys() 會傳回 array 中所有的鍵名,包含數字和字串鍵名。

如果指定了 filter_value,則只會傳回該值的鍵名。否則,會傳回 array 中所有的鍵名。

參數

array

包含要傳回鍵名的陣列。

filter_value

如果指定,則只傳回包含此值的鍵名。

strict

決定在搜尋過程中是否使用嚴格比較 (===)。

傳回值

傳回一個包含 array 中所有鍵名的陣列。

範例

範例 #1 array_keys() 範例

<?php
$array
= array(0 => 100, "color" => "red");
print_r(array_keys($array));

$array = array("blue", "red", "green", "blue", "blue");
print_r(array_keys($array, "blue"));

$array = array("color" => array("blue", "red", "green"),
"size" => array("small", "medium", "large"));
print_r(array_keys($array));
?>

上述範例會輸出:

Array
(
    [0] => 0
    [1] => color
)
Array
(
    [0] => 0
    [1] => 3
    [2] => 4
)
Array
(
    [0] => color
    [1] => size
)

參見

  • array_values() - 傳回陣列中所有的值
  • array_combine() - 使用一個陣列作為鍵名,另一個陣列作為值來建立新的陣列
  • array_key_exists() - 檢查指定的鍵名或索引是否存在於陣列中
  • array_search() - 搜尋陣列中給定的值,如果成功則返回第一個對應的鍵值。

新增註釋

使用者貢獻的註釋 27 則註釋

pat dot leblanc at gmail dot com
13 年前
值得注意的是,如果您有長整數鍵值,例如 '329462291595',它們在 64 位元系統上將被視為整數,但在 32 位元系統上將被視為字串類型。

例如
<?php

$importantKeys
= array('329462291595' =>null, 'ZZ291595' => null);

foreach(
array_keys($importantKeys) as $key){
echo
gettype($key)."\n";
}

?>

在 64 位元系統上將返回
<?php
integer (整數)
string (字串)
?>

但在 32 位元系統上
<?php
string (字串)
string (字串)
?>

我希望這能為其他人省去我遇到的巨大麻煩 :)
Sven (bitcetera.com)
18 年前
以下是如何在不顯式複製或更改原始陣列的情況下獲取(雜湊)陣列的第一個鍵值、最後一個鍵值、第一個值或最後一個值

<?php
$array
= array('first'=>'111', 'second'=>'222', 'third'=>'333');

// 取得第一個鍵值:返回 'first'
print array_shift(array_keys($array));

// 取得最後一個鍵值:返回 'third'
print array_pop(array_keys($array));

// 取得第一個值:返回 '111'
print array_shift(array_values($array));

// 取得最後一個值:返回 '333'
print array_pop(array_values($array));
?>
Ian (maxianos at hotmail dot com)
10 年前
網路上有很多多維陣列 array_keys 函式,但它們都只是將所有鍵值合併到一個平面陣列中。

以下是一種從多維陣列中查找所有鍵值的方法,同時保留陣列結構。可以設定一個可選的「最大深度」參數,以便在處理非常大的陣列時進行測試。

注意:如果子元素不是陣列,它將被忽略。

<?php
function array_keys_recursive($myArray, $MAXDEPTH = INF, $depth = 0, $arrayKeys = array()){
if(
$depth < $MAXDEPTH){
$depth++;
$keys = array_keys($myArray);
foreach(
$keys as $key){
if(
is_array($myArray[$key])){
$arrayKeys[$key] = array_keys_recursive($myArray[$key], $MAXDEPTH, $depth);
}
}
}

return
$arrayKeys;
}
?>

範例
輸入
array(
'Player' => array(
'id' => '4',
'state' => 'active',
),
'LevelSimulation' => array(
'id' => '1',
'simulation_id' => '1',
'level_id' => '1',
'Level' => array(
'id' => '1',
'city_id' => '8',
'City' => array(
'id' => '8',
'class' => 'home',
)
)
),
'User' => array(
'id' => '48',
'gender' => 'M',
'group' => 'user',
'username' => 'Hello'
)
)

輸出
array(
'Player' => array(),
'LevelSimulation' => array(
'Level' => array(
'City' => array()
)
),
'User' => array()
)
Paul Hirsch
9 年前
值得注意的是,`array_keys` 在將鍵映射到新陣列時不會保留鍵的資料類型。這在使用 `in_array` 以及對字串中的字元進行查找時產生了問題。注意:我的查找 `$array` 有一個完整的數字和字元(大小寫)映射,以便進行簡單的偽加密。

<?php
$array
= array(
'e' => 'ieio'
,'1' => 'one'
,'2' => 'two'
,'0' => 'zero'
);
var_dump($array);
$keys = array_keys($array);
var_dump($keys);

$string = '1e0';
for (
$i = 0; $i < strlen($string); $i++) {
if (
in_array($string[$i],$keys,'strict')) echo 'dude ';
else echo
'sweet ';
}
?>

輸出結果
array (size=4)
'e' => string 'ieio' (長度=4)
1 => string 'one' (長度=3)
2 => string 'two' (長度=3)
0 => string 'zero' (長度=4)

array (size=4)
0 => string 'e' (長度=1)
1 => int 1
2 => int 2
3 => int 0

sweet dude sweet

----
預期結果
兄弟 兄弟 兄弟
zammit dot andrew at gmail dot com
11 年前
如果一個陣列是空的(但已定義),或者在陣列中找不到 $search_value,則會返回一個空陣列(不是 false、null 或 -1)。這看起來可能很直觀,尤其是文件說明會返回一個陣列,但我需要 sanity 測試以確認。

<?php

$emptyArray
= array();
var_dump(array_keys($emptyArray,99)); // array (size=0) \ 空

$filledArray = array(11,22,33,42);
var_dump(array_keys($filledArray,99)); // array (size=0) \ 空

?>
Robert C.
8 年前
將多維陣列的鍵轉換為簡單陣列

想要遍歷多維陣列並將鍵以一維陣列的形式返回嗎? 這個方法可以做到。

<?php

public function array_walk_keys($array, $parentKey = null, &$flattened_array = null)
{
if(!
is_array($array))
return
$array;

foreach(
$array as $key => $val ) {
$flattenedKeysArray[] = $key;

if(
is_array($val))
array_walk_keys($val, $key, $flattenedKeysArray);
}

return
$flattenedKeysArray;
}
phpnet at holodyn dot com
11 年前
自 5.4 版起,STRICT 標準規定不能將 array_keys 包裝在像 array_shift 這樣的函式中,因為它會嘗試引用該陣列。

無效
echo array_shift( array_keys( array('a' => 'apple') ) );

有效
$keys = array_keys( array('a' => 'apple') );
echo array_shift( $keys );

但是等等! 由於 PHP(目前)允許您透過將變數括在括號中來斷開引用,因此您目前可以使用

echo array_shift( ( array_keys( array('a' => 'apple') ) ) );

然而,我預計 PHP 團隊將會在未來修改括號的規則。
jochem
18 年前
可能值得在文件中註明,並非所有關聯式(字串)鍵都相同,以下程式碼片段的輸出證明了這一點 - 對於某些人來說,這可能是 PHP 自動類型轉換的簡便介紹(並省去一些麻煩)

<?php
$r
= array("0"=>"0","1"=>"1","" =>"2"," "=>"3");
echo
'PHP 如何看待這個陣列:array("0"=>"0","1"=>"1","" =>"2"," "=>"3")',"\n-----------\n";
var_dump($r); print_r($r); var_export($r);
echo
"\n-----------\n",'var_dump("0","1",""," ") = ',"\n-----------\n";
var_dump("0","1",""," ");
?>

輸出結果

PHP 如何看待這個陣列:array("0"=>"0","1"=>"1","" =>"2"," "=>"3")
-----------
array(4) {
[0]=>
string(1) "0"
[1]=>
string(1) "1"
[""]=>
string(1) "2"
[" "]=>
string(1) "3"
}
陣列
(
[0] => 0
[1] => 1
[] => 2
[ ] => 3
)
array (
0 => '0',
1 => '1',
'' => '2',
' ' => '3',
)
-----------
var_dump("0","1",""," ") =
-----------
string(1) "0"
string(1) "1"
string(0) ""
string(1) " "
vittorh at outlook dot com
1 年前
各位朋友,您好

在 array_keys 函數手冊中 - https://php.dev.org.tw/manual/pt_BR/function.array-keys.php

說明中提到第二個搜尋參數「 $filter_value 」的類型定義為 mixed,然而在 PHP 7.4 到 8.1 版中,當傳遞一個陣列類型的 $filter_value 時,函數並不會返回 false(空陣列)。

範例

$array = ['a' => 1, 'b' => 2];

var_dump(array_keys($array,array('a','b'))); // 返回 array(0) { }
var_dump(array_keys($array,array('a','b'))); // 返回 array(0) { }
var_dump(array_keys($array,'a')); // 返回 array(0) { }

在除錯程式碼後,我認為 $filter_value 參數的描述令人困惑,因為它讓人理解成陣列中鍵的值必須是指定的值,而不是鍵的內容。
el dot quick at gmail dot com
13 年前
我的英文不好,請見諒...

我寫了一個函數來遞迴地取得陣列的鍵值...

<?php
function recursive_keys($input, $search_value = null){

$output = ($search_value !== null ? array_keys($input, $search_value) : array_keys($input)) ;
foreach(
$input as $sub){
if(
is_array($sub)){
$output = ($search_value !== null ? array_merge($output, recursive_keys($sub, $search_value)) : array_merge($output, recursive_keys($sub))) ;
}
}
return
$output ;
}
?>

希望這個函式會很有用。

此致
enrique dot balleste at gmail dot com
7 年前
一個取得所有擁有特定值的鍵的小技巧

$keys = array_keys($array, !null);
ayyappan dot ashok at gmail dot com
8 年前
Sven (59892) 的貼文需要修改

$array = array('first'=>'111', 'second'=>'222', 'third'=>'333');

$rarray = array_keys($array);

print array_shift($rarray); // first

print array_pop($rarray); //thrid

print array_shift($rarray); //second

print array_pop($rarray); // 沒有結果

以下程式碼從 5.4.0 版開始失效

print array_shift(array_keys($array)); 會拋出 Strict Standards 錯誤

Sven 的程式碼在 5.3.29 之前都能正常運作。從 5.4.0 開始,標準已更改,結果也不同。

注意事項
Strict Standards:僅變數應以傳址方式傳遞

請查看不同版本的程式碼

http://sandbox.onlinephpfunctions.com/code/24b5fddf14b635f1e37db69a7edffc2cbbed55e1

http://sandbox.onlinephpfunctions.com/code/f695e8f81e906b4f062b66cf9b3b83b6b620464c
ferrerna at gmail dot com
15 年前
這是一個我需要用來壓縮陣列的函式,在我的案例中是來自資料庫查詢。它接受一個包含鍵值對的陣列,並返回一個鍵值對實際作為鍵和值的陣列。

<?php

函數 array_collapse($arr, $x, $y) {
$carr = array();
while (
$el = current($arr)) {
$carr[ $el[$x] ] = $el[$y];
next($arr);
}
return
$carr;
}

?>

範例用法 (虛擬資料庫程式碼)

<?php

$query
= db_query('SELECT name, value FROM properties');

$result = db_returnAll($query);

/* 此函數會回傳像這樣的陣列:

[
['name' => 'color', 'value' => 'blue'],
['name' => 'style', 'value' => 'wide-format'],
['name' => 'weight', 'value' => 3.6],
['name' => 'name', 'value' => 'Waerdthing']
]

*/

$propArr = array_collapse($result, 'name', 'value');

/* 現在這個陣列看起來像這樣:

[
['color' => 'blue'],
['style' => 'wide-format'],
['weight' => 3.6],
['name' => 'Waerdthing'],

*/

?>

我發現這對於搭配 json_encode 很有用,而且我正在我的專案 http://squidby.com 中使用它
rodrigo at NOSPAM dot dhweb dot com dot br
21 年前
[編者註:關於列印複雜結構或雜湊的完整解決方案,請參閱 PEAR::Var_Dump 套件: http://pear.php.net/package-info.php?pacid=103 ,使用 "pear install Var_Dump" 來取得它]

此函數將以 HTML 表格列印多維陣列的所有鍵值。
當您無法控制深度時,它將有助於除錯。

<?php
function show_keys($ar){

echo
"<table width='100%' border='1' bordercolor='#6699CC' cellspacing='0' cellpadding='5'><tr valign='top'>";

foreach (
$ar as $k => $v ) {

echo
"<td align='center' bgcolor='#EEEEEE'>
<table border='2' cellpadding='3'><tr><td bgcolor='#FFFFFF'><font face='verdana' size='1'>
"
. $k . "
</font></td></tr></table>"
;

if (
is_array($ar[$k])) {
show_keys ($ar[$k]);
}

echo
"</td>";

}

echo
"</tr></table>";

}

// Multidimensional array ->
$arvore = array();
$arvore['1'] = array();
$arvore['1']['1.1'] = array('1.1.1', '1.1.2', '1.1.3');
$arvore['1']['1.2'] = array('1.2.1', '1.2.2', '1.2.3');
$arvore['1']['1.3'] = array('1.3.1', '1.3.2', '1.3.3');
$arvore['2'] = array();
$arvore['2']['2.1'] = array('2.1.1', '2.1.2', '2.1.3');
$arvore['2']['2.2'] = array('2.2.1', '2.2.2', '2.2.3');
$arvore['2']['2.3'] = array('2.3.1', '2.3.2', '2.3.3');
$arvore['3'] = array();
$arvore['3']['3.1'] = array('3.1.1', '3.1.2', '3.1.3');
$arvore['3']['3.2'] = array('3.2.1', '3.2.2', '3.2.3');
$arvore['3']['3.3'] = array('3.3.1', '3.3.2'=>array('3.3.2.1', '3.3.2.2'), '3.3.3');
// <-

show_keys($arvore);
?>
sip at email dot ee
21 年前
請注意,使用 array_key_exists() 的效率相當低。與呼叫函數相關的開銷使其比使用 isset($array[$key]) 而不是 array_key_exists($key, $array) 還要慢。
根據我的測試,使用 isset() 通常快了約 1.3 倍。
ru dot dy at gmx dot net
19 年前
我一直在尋找一個函數,它可以簡單地透過鍵值從一維陣列中移除不定數量個值。最後我想出了這個(如果除了陣列之外沒有其他參數,則回傳陣列本身,如果沒有參數則回傳 false - 不會更改原始陣列)

用法:array_remove(array $input [, mixed key ...])

<?php

function array_remove() {
if (
$stack = func_get_args()) {
$input = array_shift($stack);
foreach (
$stack as $key) {
unset(
$input[$key]);
}
return
$input;
}
return
false;
}

?>

測試

<?php
$a
= array('a'=>'fun', 'b'=>3.14, 'sub'=> array('1', '2', '3'), 'd'=>'what', 'e' => 'xample', 5 => 'x');
print_r($a);
print_r(array_remove($a, 'd', 'b', 5, 'sub'));
?>

輸出

陣列
(
[a] => fun
[b] => 3.14
[sub] => 陣列
(
[0] => 1
[1] => 2
[2] => 3
)

[d] => what
[e] => xample
[5] => x
)
陣列
(
[a] => fun
[e] => xample
)

希望這對某些人有幫助。
Md. Abutaleb
4 年前
<?php
# array_keys() 也會返回布林值的鍵,但布林值會以 1 或 0 返回。如果取得 NULL 值作為鍵,則會返回空值。考慮以下陣列:

$a = array(
"first_index" => "This is the first element",
true => 3,
false => 2,
4.5 => 'Something',
"08" => 5,
"8" => 6,
NULL => 'Null key'
);

print_r(array_keys($a));

Array
(
[
0] => first_index
[1] => 1
[2] => 0
[3] => 4
[4] => 08
[5] => 8
[6] =>
)

?>
izzecold at live dot de
12 年前
<?php

/* 自定義函數,用於檢查多個陣列鍵是否存在
例如,您有一個像 $_SESSION 這樣的陣列,並且您想知道鍵 'user'、'pass'、'email' 和 'type' 是否存在。

*/

function mKeyChecker($arr,$keys=array()) {
if(
count($keys) > 1) {
$valid_keys = 0;
foreach(
$keys as $key) {
if(
array_key_exists($key,$arr)) $valid_keys++;
}
if(
$valid_keys == count($keys)) {
return
true;
} else {
return
false;
}
} else if(
count($keys) == 1) {
if(
array_key_exists($keys[0],$arr)) {
return
true;
} else {
return
false;
}
} else {
return
false;
}
}

// 執行範例

if(mKeyChecker($_SESSION,array('id','user','email','type'))) {
echo
"is!";
} else {
echo
"not!";
}

?>
Hayley Watson
17 年前
RQuadling at GMail dot com 的 array_remove() 函數的替代方案

<?php
function array_remove(array $array, $value, $strict=false)
{
return
array_diff_key($array, array_flip(array_keys($array, $value, $strict)));
}
?>
vesely at tana dot it
18 年前
元素的位置。

可以應用兩次 array_keys 來從其鍵值取得元素的位置。(這是 cristianDOTzuddas 函數的反向操作。)例如,以下程式碼可能會輸出「是的,我們在位置 0 有香蕉」。

<?php
$a
= array("banana" => "yellow", "apple" = "red");
$k = get_some_fruit();
if (isset(
$a[$k]))
{
list(
$pos) = array_keys(array_keys($a), $k);
print
"yes, we have {$k}s at position $pos\n";
}
?>

效率不算好,但我想不到更好的替代方案。
creator at mindcreations dot com
17 年前
這個函式會從多維陣列中取出鍵值。

<?php
function multiarray_keys($ar) {

foreach(
$ar as $k => $v) {
$keys[] = $k;
if (
is_array($ar[$k]))
$keys = array_merge($keys, multiarray_keys($ar[$k]));
}
return
$keys;
}
?>

程式碼範例

<?php
$array
= array("color" => array("1stcolor" => "blue", "2ndcolor" => "red", "3rdcolor" => "green"),
"size" => array("small", "medium", "large"));

echo
"<pre>";
print_r($array);
echo
"</pre>";

echo
"<pre>";
print_r(multiarray_keys($array));
echo
"</pre>";
?>

輸出範例

陣列
(
[color] => 陣列
(
[1stcolor] => blue
[2ndcolor] => red
[3rdcolor] => green
)

[size] => 陣列
(
[0] => small
[1] => medium
[2] => large
)

)

陣列
(
[0] => color
[1] => 1stcolor
[2] => 2ndcolor
[3] => 3rdcolor
[4] => size
[5] => 0
[6] => 1
[7] => 2
)
craig1231 at hotmail dot com
12 年前
我需要一個函式來尋找包含部分字串的鍵值,而不是完全等於某個字串...

<?php
函式 array_keys_contain($input, $search_value, $strict = false)
{
$tmpkeys = array();

$keys = array_keys($input);

foreach (
$keys as $k)
{
if (
$strict && strpos($k, $search_value) !== FALSE)
$tmpkeys[] = $k;
elseif (!
$strict && stripos($k, $search_value) !== FALSE)
$tmpkeys[] = $k;
}

return
$tmpkeys;
}
?>
webmaster [at] baz-x [dot] at
19 年前
我正在尋找一個可以刪除整數鍵或字串鍵的函式(我的快取機制需要用到)。
因為我找不到這樣的函式,所以我寫了自己的解決方案。
我不知道該把這個函式發佈到哪裡最合適,所以我決定發佈在這裡,希望對你們有用。

<?php

函式 array_extract($array, $extract_type = 1)
{
foreach (
$array as $key => $value )
{
if (
$extract_type == 1 && is_string($key) )
{
// 刪除字串鍵
unset($array[$key]);
}
elseif (
$extract_type == 2 && is_int($key) )
{
// 刪除整數鍵
unset($array[$key]);
}
}

return
$array;
}

?>

當然,您可以定義常數讓程式碼看起來更簡潔,我選擇了以下這些: EXTR_INT = 1; EXTR_STRING = 2
EXTR_INT 會返回一個只有整數鍵的陣列,而
EXTR_STRING 會返回一個只有字串鍵的陣列。

祝您使用愉快。
theking2 at king dot ma
21 天前
PHP 的陣列很奇怪。所以…的結果

<?php
$array
= [
'element0',
'element1' => 'Hello World',
'element2' => 42,
'element3' => [ 'aaa', 'bbb' ],
];
print_r( array_keys($array) );
?>
雖然結果正確,但卻令人感到意外
陣列
(
[0] => 0
[1] => element1
[2] => element2
[3] => element3
)

PHP 中的陣列實際上是有序的鍵值對,如果缺少值,它將成為以數字作為鍵的值。要取得陣列直觀的第一維,請使用 map 搭配函式來判斷鍵是否實際上是一個索引。
以下程式碼

<?php
$array_first
= array_map(
fn (
$key)=>
is_int($key)?$array[$key]:$key
,
array_keys($array)
);
print_r($array_first);
?>

將會顯示

陣列
(
[0] => element0
[1] => element1
[2] => element2
[3] => element3
)

然而,在一個特殊情況下
<?php
$array
= [
'element0',
'element1' => 'Hello World',
'element2' => 42,
'element3' => [ 'aaa', 'bbb' ],
12 => 'I\'m a field, not a key'
];
?>
這當然行不通,並會輸出
陣列
(
[0] => element0
[1] => element1
[2] => element2
[3] => element3
[4] => I'm a field, not a key
)
qeremy [atta] gmail [dotta] com
12 年前
為陣列添加前綴的簡單方法;

<?php
function array_keys_prefix($arr, $pref = "") {
$rarr = array();
foreach (
$arr as $key => $val) {
$rarr[$pref.$key] = $val;
}
return
$rarr;
}

function
array_keys_prefix_multi($arr, $pref = "") {
$rarr = array();
foreach (
$arr as $key => $val) {
$rarr[] = array_keys_prefix($val, $pref);
}
return
$rarr;
}

// $a = array("foo" => "FOO", "bar" => "BAR", "baz" => "BAZ"); // 或
$a = array("foo" => "FOO", "bar" => "BAR", "baz" => array(1,2,3));
print_r(array_keys_prefix($a, "my_"));

// 資料庫擷取...
$products = array(
array(
"id" => 1, "name" => "Foo"),
array(
"id" => 2, "name" => "Bar")
);
print_r(array_keys_prefix_multi($products, "product_"));
?>

陣列
(
[my_foo] => FOO
[my_bar] => BAR
[my_baz] => 陣列
(
[0] => 1
[1] => 2
[2] => 3
)

)
陣列
(
[0] => 陣列
(
[product_id] => 1
[product_name] => Foo
)

[1] => 陣列
(
[product_id] => 2
[product_name] => Bar
)

)
glennh at webadept dot net
22 年前
所有酷炫的筆記都從網站上消失了。

以下是如何使用此頁面上的方法取得傳遞給程式的變數範例。它會印出這些變數,以便您可以查看正在執行的操作。

<?php
while (list($key, $value) = each
(${"HTTP_".$REQUEST_METHOD."_VARS"}))
{
echo
$key." = ".$value." ";
}
?>
neil (10 分中的 11 分)
16 年前
<?php

/*
* 這個函式會回傳在 $array_haystack 中,值存在於 $array_needle 陣列的元素鍵值
*/

function array_value_intersect_keys( $array_haystack, $array_needle ){
$intersected = array_intersect( $array_haystack, $array_needle );
return
array_keys( $intersected );
}

// 用法

$array_haystack = array( 1 => 2, 2 => 5, 'red' => 8, 9 => 14 );

$array_needle = array( 2, 8 );

$array_keys_of_intersecting_values = array_value_intersect_keys( $array_haystack, $array_needle );

print_r( $array_keys_of_intersecting_values );
?>

回傳
陣列
(
[0] => 1
[1] => red
)
To Top