PHP Conference Japan 2024

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
)

参见

添加注释

用户贡献注释 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 函数,但它们都只将所有键合并到一个扁平数组中。

以下是一种查找多维数组中所有键同时保持数组结构的方法。对于非常大的数组,可以设置可选的 MAXIMUM DEPTH 参数进行测试。

注意:如果子元素不是数组,则将被忽略。

<?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;
}
?>

示例
输入
数组(
‘Player’ => 数组(
‘id’ => ‘4’,
‘state’ => ‘active’,
),
‘LevelSimulation’ => 数组(
‘id’ => ‘1’,
‘simulation_id’ => ‘1’,
‘level_id’ => ‘1’,
‘Level’ => 数组(
‘id’ => ‘1’,
‘city_id’ => ‘8’,
‘City’ => 数组(
‘id’ => ‘8’,
‘class’ => ‘home’,
)
)
),
‘User’ => 数组(
‘id’ => ‘48’,
‘gender’ => ‘M’,
‘group’ => ‘user’,
‘username’ => ‘Hello’
)
)

输出
数组(
‘Player’ => 数组(),
‘LevelSimulation’ => 数组(
‘Level’ => 数组(
‘City’ => 数组()
)
),
‘User’ => 数组()
)
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 ';
}
?>

输出
数组 (大小:4)
‘e’ => 字符串 ‘ieio’ (长度:4)
1 => 字符串 ‘one’ (长度:3)
2 => 字符串 ‘two’ (长度:3)
0 => 字符串 ‘zero’ (长度:4)

数组 (大小:4)
0 => 字符串 ‘e’ (长度:1)
1 => 整数 1
2 => 整数 2
3 => 整数 0

sweet dude sweet

----
预期输出
dude dude dude
zammit dot andrew at gmail dot com
11年前
如果数组为空(但已定义),或者`$search_value`在数组中找不到,则返回一个空数组(而不是false、null或-1)。这似乎很直观,特别是考虑到文档说明返回的是一个数组,但我需要进行完整性测试以确保。

<?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年前
从PHP 5.4开始,严格标准规定不能将`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")
-----------
数组(4) {
[0]=>
字符串(1) "0"
[1]=>
字符串(1) "1"
[""]=>
字符串(1) "2"
[" "]=>
字符串(1) "3"
}
数组
(
[0] => 0
[1] => 1
[] => 2
[ ] => 3
)
数组 (
0 => '0',
1 => '1',
'' => '2',
' ' => '3',
)
-----------
var_dump("0","1",""," ") =
-----------
字符串(1) "0"
字符串(1) "1"
字符串(0) ""
字符串(1) " "
vittorh at outlook dot com
1年前
大家好

在`array_keys`函数手册中 - https://php.net/manual/pt_BR/function.array-keys.php

它描述了第二个搜索参数“`$filter_value`”被定义为混合类型,但是在PHP 7.4到8.1版本中,当传递类型为数组的`$filter_value`时,函数不会返回false(空数组)。

示例

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

var_dump(array_keys($array,array('a','b'))); // 返回数组(0) { }
var_dump(array_keys($array,array('a','b'))); // 返回数组(0) { }
var_dump(array_keys($array,'a')); // 返回数组(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);
[email protected]
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)); 抛出严格标准错误

Sven 的代码在 5.3.29 版本之前运行良好。从 5.4.0 版本开始,标准发生了变化,结果也不同。

注意
严格标准:只有变量才能通过引用传递

请查看不同版本的代码

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

http://sandbox.onlinephpfunctions.com/code/f695e8f81e906b4f062b66cf9b3b83b6b620464c
[email protected]
15 年前
这是一个我需要的函数,用于压缩数组,在我的例子中是从数据库查询中获取的。它接收一个包含键值对的数组,并返回一个数组,其中键值对实际上是键和值。

<?php

function 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 中使用它
[email protected]
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>";

}

// 多维数组 ->
$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);
?>
[email protected]
21 年前
请注意,使用 array_key_exists() 效率较低。调用函数相关的开销使其比使用 isset($array[$key]) 代替 array_key_exists($key, $array) 更慢。
根据我的测试,使用 isset() 通常快约 1.3 倍。
[email protected]
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] => Array
(
[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" => "这是第一个元素",
true => 3,
false => 2,
4.5 => '某些内容',
"08" => 5,
"8" => 6,
NULL => 'Null 键'
);

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($key[0],$arr)) {
return
true;
} else {
return
false;
}
} else {
return
false;
}
}

// 执行示例

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

?>
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
"是的,我们在位置 {$pos} 处有 {$k}s\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
function 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

function 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] => Array
(
[0] => 1
[1] => 2
[2] => 3
)

)
数组
(
[0] => Array
(
[product_id] => 1
[product_name] => Foo
)

[1] => Array
(
[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 at 11 out of 10
16年前
<?php

/*
* 此函数将返回干草堆中元素的键,其中在数组针中找到该值
*/

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