Почему не выводится ключ массива?

200
31 января 2018, 14:55

Есть код:

$fruits = array('sweet' => 'bug', 'sour' => array('ok1' => 'my', 'ok2' => 'your'));
function test_print($item, $key)
{
    echo "$key содержит $item\n";
}
array_walk_recursive($fruits, 'test_print');

Ответ:

sweet содержит bug 
ok1 содержит my 
ok2 содержит your

Проблема в том, что не выводится название ключа, если внутри него ещё массив, в данном примере ключ sour не был выведен на экран. Как это исправить?

Answer 1

Ещё вариант - эта функция распечатает массив ввиде дерева, а ключи массива, значение которого будет содержать массив, будут обозначены типом (array):

<?php
$fruits = array(
    'sweet' => 'bug',
    'sour' => array(
        'ok1'=> 'my',
        'ok2'=> 'your',
        'ok3'=> array(
            'ok1'=> 'my',
            'ok2'=> 'your'
        )
    )
);
echo tree($fruits);

function tree($array, $tab = '', $result = '') {
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $result .= "{$tab}[$key] <i>(array)</i><br>";
            $tab .= str_repeat('&nbsp;', 4);
            $result .= tree($value, $tab);
        } else {
            $result .= "{$tab}[$key] => <b>$value</b><br>";
        }
    }
    return $result;
}
Answer 2

Поскольку в документации array_walk_recursive() сказано:

Обратите внимание, что ключ sweet никогда не отображается. Любой ключ, содержащий значение типа array, не будет передаваться в функцию.

По-этому, пишем свой рекурсивной метод:

$fruits = array('sweet' => 'bug', 'sour' => array('ok1' => 'my', 'ok2' => 'your'));
function recursive($array) 
{
    // Для каждого элемента
    foreach($array as $key => $value) 
    {
        if (is_array($value)){
            // Если значение это массив ...
            echo $key . ' содержит ' . $value . '\n';
            recursive($value);
        } else {
            // Если это не массив ...
            echo $key . ' содержит ' . $value . '\n';
        }
    }
}
recursive($fruits);

Результат:

sweet содержит bug
sour содержит Array
ok1 содержит my
ok2 содержит your
READ ALSO
как реализовать вызов метода модели при каждом обращении к контроллера через поведение yii2?

как реализовать вызов метода модели при каждом обращении к контроллера через поведение yii2?

как реализовать вызов метода модели при каждом обращении к контроллера через поведение yii2?

156
Как правильно удалить php модуль в centos?

Как правильно удалить php модуль в centos?

Centos 6Решил обновить на сервере версию php c 5

146
modx revolution как установить ckeditor-4?

modx revolution как установить ckeditor-4?

Здравствуйте, как установить визуальный редактор версии ckeditor-4 на modx?

142