Проверьте, существует ли определенный массив ключей в многомерном массиве - PHP

Я имею многомерную матрицу, например. (это может быть много уровней):

$array = Array ( 
    [21] => Array ( ) 
    [24] => Array ( 
        [22] => Array ( ) 
        [25] => Array ( 
            [26] => Array ( ) 
        ) 
    ) 
) 

Я пытаюсь пропустить его, чтобы увидеть, существует ли определенный ключ:

$keySearch=22; // key seraching 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);

Но ничего не находит. Есть ли ошибка в цикле?

Ответы

Ответ 1

Я играл с вашим кодом, чтобы заставить его работать:

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

array_key_exists() полезно.

Тогда что-то вроде этого:

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

Рабочий пример: http://codepad.org/GU0qG5su

Ответ 3

function findKey($array, $keySearch)
{
    // check if it 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 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>';
}

Ответ 4

Вы можете написать его в одной строке кода! да!

str_contains(json_encode($array), 'key')

Ответ 5

Наверняка некоторые ошибки, это примерно то, что вам нужно? (Неиспользованный код):

$keySearch = 22;//key seraching для

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

Ответ 6

возвращает 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;
}

Ответ 7

Вот однострочное решение:

echo strpos(json_encode($array), $key) > 0 ? "found" : "not found";

Это преобразует массив в строку, содержащую эквивалент JSON, затем использует эту строку в качестве аргумента haystack функции strpos(), и в качестве аргумента иглы используется $key ($ key - значение, которое нужно найти в JSON строка).

Это может быть полезно сделать, чтобы увидеть преобразованную строку: echo json_encode($array);

Обязательно приложите аргумент иглы в одинарные кавычки, а затем в двойные кавычки, потому что часть имени пары имя/значение в строке JSON будет отображаться с двойными кавычками вокруг нее. Например, если вы ищете 22 в массиве ниже, то $key = '"22"' даст правильный результат не найден в этом массиве:

$array =
Array ( 
        21 => Array ( ), 
        24 => 
        Array ( 
            522 => Array ( ),
            25 =>
                Array ( 
                26 => Array ( ) 
            )
        )
    );

Однако, если одинарные кавычки оставлены, как и в $key = "22", то для массива выше будет получен неправильный результат найденный.

РЕДАКТИРОВАТЬ: Дальнейшим усовершенствованием будет поиск $key = '"22":'; только для того, чтобы в массиве существовало значение "22". то есть. 27 => "22" Кроме того, этот подход не является доказательством пули. Неверный найденный может возникнуть, если любое из значений массива содержит строку '"22":'