array_keys

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

array_keys返回数组中所有键或键的子集

描述

array_keys(array $array): array
array_keys(array $array, mixed $filter_value, bool $strict = false): array

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
)

参见

添加笔记

用户贡献笔记 29 笔记

141
pat dot leblanc at gmail dot com
12 年前
值得注意的是,如果您有长整型键,例如 '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
?>

希望这能帮助某人避免我遇到的巨大麻烦 :)
59
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));
?>
28
Ian (maxianos at hotmail dot com)
10 年前
有很多多维数组_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;
}
?>

示例
输入
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()
)
16
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' (length=4)
1 => string 'one' (length=3)
2 => string 'two' (length=3)
0 => string 'zero' (length=4)

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

sweet dude sweet

----
预期看到
dude dude dude
17
phpnet at holodyn dot com
10 年前
从 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 团队将修改括号的规则。
16
zammit dot andrew at gmail dot com
10 年前
如果数组为空(但已定义),或者 $search_value 在数组中未找到,则返回一个空数组(而不是 false、null 或 -1)。这可能看起来很直观,尤其是考虑到文档说返回的是一个数组,但我需要进行健全性测试以确保

<?php

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

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

?>
6
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;
}
6
jochem
18 年前
可能值得在文档中指出并非所有关联(字符串)键都一样,以下代码的输出证明了这一点——这可能对一些人来说是 PHP 自动类型转换的简明介绍(并避免一些头痛)

<?php
$r
= array("0"=>"0","1"=>"1","" =>"2"," "=>"3");
echo
'how php sees this array: 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",""," ");
?>

输出

how php sees this array: array("0"=>"0","1"=>"1","" =>"2"," "=>"3")
-----------
array(4) {
[0]=>
string(1) "0"
[1]=>
string(1) "1"
[""]=>
string(1) "2"
[" "]=>
string(1) "3"
}
Array
(
[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) " "
1
vittorh at outlook dot com
11 个月前
大家好

在 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'))); // 返回 array(0) { }
var_dump(array_keys($array,array('a','b'))); // 返回 array(0) { }
var_dump(array_keys($array,'a')); // 返回 array(0) { }

调试代码时,我认为 $filter_value 参数的描述令人困惑,因为它被理解为数组中键的值必须是指定的值,而不是键的内容
12
el dot quick at gmail dot com
12 年前
我的英语不好,请见谅……

我写了一个函数来递归获取数组的键……

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

希望它能有用

致敬
4
enrique dot balleste at gmail dot com
7 年前
一个获取所有具有某种类型值的键的小技巧

$keys = array_keys($array, !null);
3
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 : Only variables should be passed by reference

请查看不同版本中的代码

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

http://sandbox.onlinephpfunctions.com/code/f695e8f81e906b4f062b66cf9b3b83b6b620464c
7
ferrerna at gmail dot com
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
4
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>";

}

// 多维数组 ->
$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);
?>
6
sip at email dot ee
20 年前
注意,使用 array_key_exists() 效率很低。与调用函数相关的开销使其比使用 isset($array[$key]) 更慢,而不是 array_key_exists($key, $array)
根据我的测试,使用 isset() 通常快 1.3 倍。
7
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'));
?>

输出

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

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

希望这对某人有所帮助。
3
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] =>
)

?>
4
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
"is!";
} else {
echo
"not!";
}

?>
4
Hayley Watson
16 年前
作为 RQuadling at GMail dot com's array_remove() 函数的替代方法

<?php
function array_remove(array $array, $value, $strict=false)
{
return
array_diff_key($array, array_flip(array_keys($array, $value, $strict)));
}
?>
7
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";
}
?>

效率并不高,但我没有看到更好的替代方案。
4
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>";
?>

示例输出

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

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

)

Array
(
[0] => color
[1] => 1stcolor
[2] => 2ndcolor
[3] => 3rdcolor
[4] => size
[5] => 0
[6] => 1
[7] => 2
)
1
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"); // or
$a = array("foo" => "FOO", "bar" => "BAR", "baz" => array(1,2,3));
print_r(array_keys_prefix($a, "my_"));

// db fetch...
$products = array(
array(
"id" => 1, "name" => "Foo"),
array(
"id" => 2, "name" => "Bar")
);
print_r(array_keys_prefix_multi($products, "product_"));
?>

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

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

[1] => Array
(
[product_id] => 2
[product_name] => Bar
)

)
1
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;
}
?>
0
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 将返回一个数组,其中键仅为字符串

玩得开心。
0
glennh at webadept dot net
21 年前
网站上所有酷炫的笔记都消失了。

以下是如何使用本页上的方法获取传递给程序的所有变量的示例。 这将打印它们,以便你可以看到自己在做什么。

<?php
while (list($key, $value) = each
(${"HTTP_".$REQUEST_METHOD."_VARS"}))
{
echo
$key." = ".$value." ";
}
?>
-2
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 );
?>

返回
Array
(
[0] => 1
[1] => red
)
-7
anthony at berglas dot org
12 年前
需要注意的是,keys 的逆函数(将键转换为值)是 array_count_values(将值转换为键)。 这是使用 array_intersect_key 之类的东西所必需的。 可以放在几个地方。 我花了一段时间才弄明白。
-14
nodarinodo at mail dot ru
15 年前
<?php
// 这是从值中获取键的方法 )
$es = array("is My FullName"=>"nodar chkuaselidze (nodarinodo)", "You Are" => "I don't know", "Is My Friend" => "ruxadze");
foreach(
array_values($es) as $ess){
echo
$ess." =>";

for(
$i =0; $i < count(array_keys($es, $ess)); $i++){
echo
reset(array_keys($es, $ess))."<BR>";
} }
?>
-11
Na&#39;ven Enigma
12 年前
我试图弄清楚如何规范化具有数值键的数组。 由于我正在为很多事情做 for(),但只有在条件正确的情况下才替换它,所以我最终得到了无法访问的非球形数组。 话虽如此,我一直在寻找规范化数组的方法,但没有找到,所以我创建了自己的方法。 我不知道如何使其递归,但对于我自己来说,我不需要这个功能,所以我只是没有递归。

// 这将把数组([5] => "test1", [4] => "test2", [9] => "test3") 转换为数组([0] => "test1", [1] => "test2", [2] => "test3"),这样你就可以更轻松地访问它。
function normalize_array($array){
$newarray = array();
$array_keys = array_keys($array);
$i=0;
foreach($array_keys as $key){
$newarray[$i] = $array[$key];

$i++;
}
return $newarray;
}
To Top