2010-10-06 4 views
5
$temp = array(); 
function show_keys($ar) 
{ 
    foreach ($ar as $k => $v) 
    { 
     $temp[] = $k; 
     if (is_array($ar[$k])) 
     { 
      show_keys ($ar[$k]); 
     } 
    } 

    return $temp; 
} 

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

+0

Эта рекурсия бесконечна во многих случаях. – Svisstack

+2

Примечание о стиле: не вызывайте переменные 'temp' или' tmp', ** особенно ** в глобальном пространстве имен, что приводит к путанице. Имена должны быть описательными; назовите его 'keys', так как это то, что он содержит. – meagar

ответ

1

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

global $temp; 

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

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

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

+0

Никакой разницы, похоже, что он принимал $ temp в первую очередь. – HyderA

+0

Возможно, вы правы, это было на один шаг ближе к решению. – HyderA

4

Основная проблема заключается в том, что вы выбрасываете результаты рекурсивных вызовов 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

Это может сделать трюк?

Вам нужно либо ввести $ 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; 
} 
+0

Да, это было .. спасибо господин! – HyderA

0

Из-за этой функции бесконечна. Но моя задача состоит в том, чтобы помочь вам)

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

Использование 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); 
} 
?> 
+0

Удивительный способ делать вещи :) И очень эффективно. Благодаря! –

2

Я вижу много чрезмерно сложной решения здесь ....

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

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

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

$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 ?? []; 
}