Мне нужен array_keys_recursive () - PullRequest
       26

Мне нужен array_keys_recursive ()

6 голосов
/ 06 октября 2010
$temp = array();
function show_keys($ar)
{
    foreach ($ar as $k => $v )
    {
        $temp[] = $k;
        if (is_array($ar[$k]))
        {
            show_keys ($ar[$k]);
        }
    }

    return $temp;
}

Я пытался использовать эту функцию, но она по-прежнему возвращает только первый ключ.

Ответы [ 7 ]

8 голосов
/ 06 октября 2010

Используя SPL, зацикливание ключей довольно просто (сохраните их в другом массиве, если хотите):

<?php
$arr = array_fill(0,8,range(0,3));
var_dump($arr);
foreach( new RecursiveIteratorIterator(
    new RecursiveArrayIterator($arr),
    RecursiveIteratorIterator::SELF_FIRST)
  as $key => $value){
        var_dump($key);
}
?>
5 голосов
/ 06 октября 2010

Я вижу здесь слишком много сложных решений ....

function array_keys_r($array) {
  $keys = array_keys($array);

  foreach ($array as $i)
    if (is_array($i))
      $keys = array_merge($keys, array_keys_r($i));

  return $keys;
}
4 голосов
/ 06 октября 2010

Основная проблема в том, что вы отбрасываете результаты рекурсивных вызовов show_keys(). Вы ничего не делаете с возвращаемым значением.

Комментарии встроены.

function show_keys($ar)
{
    // Create new temp array inside function so each recursive call gets
    // a separate instance.
    $temp = array();

    foreach ($ar as $k => $v )
    {
        $temp[] = $k;

        // Use $v instead of $ar[$k].
        if (is_array($v))
        {
            // Combine results of recursive show_keys with $temp.
            $temp = array_merge($temp, show_keys($v));
        }
    }

    return $temp;
}
2 голосов
/ 06 октября 2010

Это может сработать?

Вы должны будете либо ввести $ temp в качестве глобального, либо получить возвращаемое значение из каждой рекурсии. И мы хотели бы избежать глобальных переменных, поэтому мы объединяем значения из каждого вызова рекурсии с предыдущими собранными значениями.

function show_keys($ar)
{
    $temp = array();
    foreach ($ar as $k => $v )
    {
        $temp[] = $k;
        if (is_array($ar[$k]))
        {
            $temp = array_merge(show_keys ($ar[$k]), $temp);
        }
    }

    return $temp;
}
1 голос
/ 04 мая 2017

Вопрос двусмысленный, потому что вы не указали свой ввод и ожидаемый вывод.

Рассмотрите этот пример массива:

$array = [
    'first' => [
        'second' => [
            'third' => 'three',
        ],
        'deuxième' => 'two',
    ],
];

Все остальные решения до сих пор обеспечивают сглаженное одно-список ключей размерного массива.

$keys = [
    'first',
    'second',
    'third',
    'deuxième',
];

Однако мне понадобилась функция array_keys_recursive, которая бы сохраняла иерархию.

$keys = [
    'first' => [
        'second' => [
            'third',
        ],
        'deuxième',
    ],
];

Для всех, кто ищет аналогичную потребностьвот мое решение:

function array_keys_recursive(array $array) : array
{
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $index[$key] = array_keys_recursive($value);
        } else {
            $index []= $key;
        }
    }

    return $index ?? [];
}
0 голосов
/ 06 октября 2010

Потому что эта функция бесконечна. Но моя задача помочь тебе)

function show_keys($ar, $temp = array())
{    
    if (!empty($ar)) {
    foreach ($ar as $k => $v )
    {
        $temp[] = $k;
        if (is_array($ar[$k]))
        {
            $temp += show_keys($ar[$k], $temp);
        }
    }
    }

    return $temp;
}
0 голосов
/ 06 октября 2010

Ваш массив $temp является глобальным.Чтобы сделать доступным в функции вам нужно:

global $temp;

в начале функции.

В настоящее время каждый вызов функции создает новый массив с именем $temp икогда вы наконец возвращаетесь из функции к вызывающей стороне, возвращается $temp, созданный вами при первом вызове, который имеет только ключи вашего первого уровня.

Обратите внимание, что использование глобальных переменных не является хорошим программированием,Вам необходимо передать массив в качестве аргумента рекурсивным вызовам и изменить переданный массив, добавив ключи, найденные в каждой итерации, как это сделали Александр и Джон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...