obtener - Compruebe si existe una clave de matriz específica en una matriz multidimensional-PHP
php array key value (8)
Tengo una matriz multidimensional, por ejemplo (esto puede tener muchos niveles de profundidad):
$array = Array (
[21] => Array ( )
[24] => Array (
[22] => Array ( )
[25] => Array (
[26] => Array ( )
)
)
)
Estoy intentando recorrerlo para ver si existe una cierta clave:
$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);
Pero no encuentra nada. ¿Hay algún error en el bucle?
Aquí hay una solución de una línea:
echo strpos(json_encode($array), $key) > 0 ? "found" : "not found";
Esto convierte la matriz en una cadena que contiene el equivalente de JSON, luego usa esa cadena como el argumento del pajar de la función strpos () y usa la clave $ como el argumento de la aguja (la clave $ es el valor que se encuentra en la cadena JSON).
Puede ser útil hacer esto para ver la cadena convertida: echo json_encode($array);
Asegúrese de incluir el argumento de la aguja entre comillas simples y luego comillas dobles porque la parte del nombre del par nombre / valor en la cadena JSON aparecerá con comillas dobles a su alrededor. Por ejemplo, si busca 22 en la matriz a continuación, $key = ''"22"''
dará el resultado correcto de no encontrarse en esta matriz:
$array =
Array (
21 => Array ( ),
24 =>
Array (
522 => Array ( ),
25 =>
Array (
26 => Array ( )
)
)
);
Sin embargo, si las comillas simples se dejan, como en $key = "22"
entonces se obtendrá un resultado incorrecto de la matriz anterior.
EDITAR: Una mejora adicional sería buscar $key = ''"22":'';
solo en caso de que exista un valor de "22"
en la matriz. es decir. 27 => "22"
Además, este enfoque no es a prueba de balas. Un resultado incorrecto podría aparecer si alguno de los valores de la matriz contiene la cadena ''"22":''
Jugué con tu código para que funcione:
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;
}
Por supuesto algunos errores, ¿esto es más o menos lo que buscas? (Código no probado):
$keySearch=22;
// búsqueda de teclas para
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;
}
}
}
}
Primero crea una función para obtener una matriz de todas las claves:
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;
}
A continuación, compruebe la existencia:
strpos(json_encode(array_keys_multi($array)), ''"key"'')
devuelve false si no existe, devuelve la primera instancia si existe;
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;
}
array_key_exists()
es helpful .
Entonces algo como esto:
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;
}
Ejemplo de trabajo: http://codepad.org/GU0qG5su
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>'';
}
if(isset($arr[''first''][''second''][''third''])){
// exists
}