我有一个多维数组,例如(这可以是很多层次):
$array = Array (
[21] => Array ( )
[24] => Array (
[22] => Array ( )
[25] => Array (
[26] => Array ( )
)
)
)
我试图遍历它以查看某个密钥是否存在:
$keySearch = 22; // key searching for
function findKey($array, $keySearch) {
foreach ($array as $item){
if (isset($item[$keySearch]) && false === findKey($item[$keySearch], $item)){
echo 'yes, it exists';
}
}
}
findKey($array, $keySearch);
但它一无所获。循环中是否有错误?
答案 0 :(得分:38)
array_key_exists()
是helpful。
然后是这样的:
function multiKeyExists(array $arr, $key) {
// is in base array?
if (array_key_exists($key, $arr)) {
return true;
}
// check arrays contained in this array
foreach ($arr as $element) {
if (is_array($element)) {
if (multiKeyExists($element, $key)) {
return true;
}
}
}
return false;
}
答案 1 :(得分:32)
我使用你的代码来实现它:
function findKey($array, $keySearch)
{
foreach ($array as $key => $item) {
if ($key == $keySearch) {
echo 'yes, it exists';
return true;
} elseif (is_array($item) && findKey($item, $keySearch)) {
return true;
}
}
return false;
}
答案 2 :(得分:3)
function findKey($array, $keySearch)
{
// check if it's even an array
if (!is_array($array)) return false;
// key exists
if (array_key_exists($keySearch, $array)) return true;
// key isn't in this array, go deeper
foreach($array as $key => $val)
{
// return true if it's found
if (findKey($val, $keySearch)) return true;
}
return false;
}
// test
$array = Array (
21 => Array ( 24 => 'ok' ),
24 => Array (
22 => Array ( 29 => 'ok' ),
25 => Array (
26 => Array ( 32 => 'ok' )
)
)
);
$findKeys = Array(21, 22, 23, 24, 25, 26, 27, 28, 29, 30);
foreach ($findKeys as $key)
{
echo (findKey($array, $key)) ? 'found ' : 'not found ';
echo $key.'<br>';
}
答案 3 :(得分:2)
这是一个单行解决方案:
echo strpos(json_encode($array), $key) > 0 ? "found" : "not found";
这会将数组转换为包含JSON等效项的字符串,然后它将该字符串用作strpos()函数的haystack参数,并使用$ key作为needle参数($ key是要在JSON中查找的值)字符串)。
这样做有助于查看转换后的字符串:echo json_encode($array);
确保将needle参数括在单引号中,然后用双引号括起来,因为JSON字符串中名称/值对的名称部分将在其周围出现双引号。例如,如果在下面的数组中查找22,那么$key = '"22"'
将在此数组中提供未找到的正确结果:
$array =
Array (
21 => Array ( ),
24 =>
Array (
522 => Array ( ),
25 =>
Array (
26 => Array ( )
)
)
);
但是,如果单引号保留,例如$key = "22"
,那么上面的数组将导致找到的错误结果。
编辑:进一步的改进是搜索$key = '"22":';
只是在数组中存在"22"
的值。即。 27 => "22"
此外,这种方法不是防弹措施。如果任何数组的值包含字符串'"22":'
答案 4 :(得分:1)
肯定有些错误,这大致是你追求的吗? (未经测试的代码):
$keySearch=22;
//密钥搜索
function findKey($array, $keySearch)
{
// check whether input is an array
if(is_array($array)
{
foreach ($array as $item)
{
if (isset($item[$keySearch]) || findKey($item, $keysearch) === true)
{
echo 'yes, it exists';
return true;
}
}
}
}
答案 5 :(得分:1)
如果不存在则返回false,如果有,则返回第一个实例;
function searchArray( array $array, $search )
{
while( $array ) {
if( isset( $array[ $search ] ) ) return $array[ $search ];
$segment = array_shift( $array );
if( is_array( $segment ) ) {
if( $return = searchArray( $segment, $search ) ) return $return;
}
}
}
return false;
}
答案 6 :(得分:0)
这是在任何维度数组中查找并返回键值的一种解决方案。
function findValByKey($arr , $keySearch){
$out = null;
if (is_array($arr)){
if (array_key_exists($keySearch, $arr)){
$out = $arr[$keySearch];
}else{
foreach ($arr as $key => $value){
if ($out = self::findValByKey($value, $keySearch)){
break;
}
}
}
}
return $out;
}
答案 7 :(得分:-2)
首先创建一个获取所有键数组的函数:
function array_keys_multi(array $array)
{
$keys = array();
foreach($array as $key => $value) {
$keys[] = $key;
if (is_array($array[$key]))
$keys = array_merge($keys, array_keys_multi($array[$key]));
}
return $keys;
}
然后检查存在:
strpos(json_encode(array_keys_multi($array)), '"key"')
答案 8 :(得分:-2)
if(isset($arr['first']['second']['third'])){
// exists
}