Foreach в многомерном массиве не работает - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть два способа просмотра каталогов и создания дерева.

public function getFolders($path)
{
    $folders = \Storage::disk('public')->directories($path);

    return count($folders) > 0 ? $folders : [];
}

public function getTree($path = '')
{
    if (count($tree = $this->getFolders($path)) === 0) {
        return ['nema'];
    }

    $arr = [];
    foreach ($tree as $value) {
        $folder = str_replace($path, '', $value);
        if (count(explode('/', $folder)) === 1) {
            if (count($this->getFolders($value)) > 0) {
                $arr[$folder] = $this->getTree($value . '/');
            } else {
                $arr[$folder] = $folder;
            }
        }
    }

    return $arr;
}

Когда я dd($arr), я получаю:

array:1 [▼
  "files" => array:2 [▼
    422 => array:1 [▶]
    "shares" => array:2 [▼
      "sasic" => array:2 [▼
        "daasdasd" => "daasdasd"
        "thumbs" => "thumbs"
      ]
      "thumbs" => "thumbs"
    ]
  ]
]

Но когда я пытаюсь это сделать:

$test = 0;
foreach($arr as $folder) 
{  
    if(is_array($folder)){
        $test = $test + 1;
    }
}

return $test; // returns 0 like there is zero arrays

Странно то, что если я использую echo в foreach, он идет не сверху вниз, а в некотором смешанном порядке.

Есть идеи?

Я пытаюсь создать дерево меню только из каталогов в какой-то папке на общедоступном диске хранилища Laravel.

Обновление: я добавил сюда $test в цикле, написав эту часть кода.Не копировал это так, это не отвечает на мой вопрос, почему значения не находятся в массиве.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Вы должны использовать подход ООП PHP с использованием классов итераторов:

class DirectoryArrayTreeIterator extends RecursiveDirectoryIterator
{
  function current()
  {
    return ($this->isDir()) ? iterator_to_array($this->getChildren()) : $this->getFilename();
  }
}

$iter = new DirectoryArrayTreeIterator('/path/to/folder', DirectoryArrayTreeIterator::SKIP_DOTS | DirectoryArrayTreeIterator::KEY_AS_FILENAME);
var_dump(iterator_to_array($iter));
0 голосов
/ 23 февраля 2019

Если у вас ничего нет ... Вы можете использовать ту же рекурсию, но вам не нужно ничего хранить в массиве.

<?php

Вам нужна функция, и я предлагаю использовать параметры URL и AMOUNT

function CountFolders($url,$amount)
{

Функция получает список файлов и папок в текущей папке

$urlm=scandir($url);    

Циклы по ним

foreach($urlm as $folder)
{

Проверяет, найден ли каталог или файл.

Если это каталог, а не ссылка для возврата ("." И ".."), подсчитывается его количество каталогов.

if((is_dir($url.'/'.$folder))&&($folder!='.')&&($folder!='..'))
{
    $amount = $amount + 1;

Необязательно, чтобы показатьсписок найденных каталогов.

Здесь можно при необходимости сохранить имя каталога или URL-адрес массива.

//echo $url.'/'.$folder.' - <strong>DIR</strong><hr>';

Если это каталог, проверьте его на наличие других каталогов в нем

        $amount=CountFolders($url.'/'.$folder,$amount);
    }
  }

Функция возвращает количество каталогов в каталоге.

  return $amount;
}

Наконец, показывает результат

echo'Total directories: '.CountFolders('../TestFolder',0);
?>

И весь код в одном месте:

<?php

function CountFolders($url,$amount)
{
    $urlm=scandir($url);    
    foreach($urlm as $folder)
    {
        if((is_dir($url.'/'.$folder))&&($folder!='.')&&($folder!='..'))
        {
            $amount = $amount + 1;

            echo $url.'/'.$folder.' - <strong>DIR</strong><hr>';

            $amount=CountFolders($url.'/'.$folder,$amount);
        }
    }
    return $amount;
}

echo'Total folders: '.CountFolders('../TestFolder',0);

?>
0 голосов
/ 23 февраля 2019

В этом случае вам нужно использовать «рекурсию».

function CountFolders($folder_array,$amount)
{
    foreach($folder_array as $folder)
    {
        if(is_array($folder))
        {
            $amount = $amount + 1;
            $amount=CountFolders($folder,$amount);

        }
    }
    return $amount;
}

echo'Total folders: '.CountFolders($arr,0);

Эта функция проверяет, и если массив найден, вызывает для него SELF и повторяется до тех пор, пока не будут подсчитаны все массивы.

Таким образомвам не нужно знать максимальную "глубину" массива.

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