я заметил проводное поведение php, когда делал что-то вроде
приведенный ниже код пытается перебрать все массивы в multiarray, и он должен вернуть $ n, когда он больше не является массивом.
в основном счетчик для величин.
<?php //some random values multiarray $arrays[1][2][3][5] = '1'; $arrays[1][2][3] = '1'; $arrays[1][2][3][4] = '1'; $arrays[3][6][3][1][5] = '2'; function second_func($array, $n)//adding $n then returning to 1st func { $n++; first_func($array, $n); } function first_func($arrays, $n = 0)//checking if array then 2nd func, if not then return. { if(is_array($arrays)) { foreach($arrays as $array)second_func($array, $n); }else { echo $n; //working return $n; //not working }; } $result[] = first_func($arrays); print_r($result);//nothing here
или любые подобные действия, если я поместил file_put_contents внутри 1-й функции, тогда результат будет различным с каждым обновлением, и функция не может быть возвращена так же, как и есть, только эхо ее работает стабильно.
Я помню, что у меня была аналогичная функция для удаления файлов кеша, и в итоге я получил чистый жесткий диск или аналогичную функцию для создания файла, и у меня были бы файлы в случайных папках по hd.
не проверял для подобных quastions, не может сформулировать quastion право.
Проблема с вашим кодом заключается в том, что функция first_func
не всегда возвращает значение, только если аргумент не является массивом. Но так как вы называете это изначально аргументом массива, этот конкретный вызов ничего не возвращает, и это объясняет пустой вывод, который вы получаете. Таким образом, даже когда вы вызываете функцию рекурсивно (через second_func
), вы все равно должны что-то возвращать.
Если я правильно понимаю, вы хотите получить выход на «лист» в дереве вложенных массивов: для каждого листа должна быть выведена его глубина в дереве.
Вот как вы могли это сделать:
function first_func($arrays, $n = 0) { if(is_array($arrays)) { $result = []; foreach($arrays as $array) $result = array_merge($result, first_func($array, $n+1)); } else { $result = [$n]; } return $result; }
Это вернет массив целых чисел, где каждое целое число представляет глубину конкретного листа в данных.
Обратите внимание, что я удалил second_func
, так как это довольно тривиально. Запись first_func($arrays, $n+1)
не менее ясна, чем second_func($array, $n)
. Если вы хотите сохранить second_func
, то обязательно верните значение:
function second_func($array, $n) { $n++; return first_func($array, $n); }
Для этих данных:
$arrays = [ 1 => [ 2 => [ 3 => "1 1" ] ], 3 => [ 6 => [ 3 => [ 1 => [ 5 => "2" ] ] ] ] ];
… приведенный выше код вернется:
[3, 5]
Который может быть отформатирован как 35:
echo implode("", first_func($arrays));