@VicTHOR

Почему не заполняется массив в классе и как сделать заполнение с callback'ом?

[изменено]
Все внимание на функцию single.
Если сделать print_r($this->paths); так, как сейчас, то вывод:
- куча массивов (каждое значение принтует по новой)
- куча NULL
Если сделать print_r($this->paths); чуть выше, внутри проверки if, после объявления, то вывод:
- никаких NULL
- куча массивов (каждое значение - новый массив)
Только вот во втором случае логично, что каждое значение по новой принтует, но почему это происходит, если вынести за рамки проверки принт? И почему попадают пустые значения? Как-будто это в итерации все происходит.. Как исправить?
Class CheckImgPath
{
    public function __construct()
    {
        $this->paths = [];
    }

    private function _checkPath($dir)
    {
        $path = scandir($dir);
        foreach($path as $value)
        {
            if ($value == '.' || $value == '..') continue;
            $check = $dir."/".$value;
            if (is_dir($check)) {
                self::checkImg($check);
            } else {
                $brand = $dir;
            }
        }
        return $brand;
    }

    public static function checkImg($arr) 
    {
        $single = new CheckImgPath;
        $single->single($arr);
    }

    private function single($arr)
    {
        if (self::_checkPath($arr)) {
            $this->paths[] = self::_checkPath($arr);
        }
        print_r($this->paths);
    }
}
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
@VicTHOR Автор вопроса
Переделал:
Class CheckImgPath
{
    private $paths = [];

    private function _checkPath($dir)
    {
        global $paths;
        $path = scandir($dir);
        foreach($path as $value)
        {
            if ($value == '.' || $value == '..') continue;
            $check = $dir."/".$value;
            if (is_dir($check)) {
                self::_checkPath($check);
            } else {
                $paths[] = $dir;
            }
        }
    }

    public static function checkImg($userPath) 
    {
        global $paths;
        $single = new CheckImgPath;
        if (empty($paths)) {
            $single->_checkPath($userPath);
        }
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@oxidmod
Используй дебаггер, ЛЮК!!!
Ответ написан
@kifirch
Это называется рекурсия
А еще ты написал монстра self, $this все рядом (плюс вызовы не статики как статики и аааа ужас)

По сути
Class CheckImgPath {
      public static $paths = [];
      // в конструкторе делать ничего, совсем его убери
     // обращения должны быть self::$paths
    
}


У тебя создается херова гора (в зависимости от вложенности каталогов) инстансов CheckImgPath , каждый раз с чистого листа создается $this->paths = [];
Но это не едиственная проблема этого кода

Как делать более лучше - см примеры тут https://www.php.net/manual/ru/function.scandir.php
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ASTRIO agency Ульяновск
от 30 000 до 100 000 руб.
Webshop-NN Нижний Новгород
от 40 000 руб.
Лайки Новокузнецк
от 40 000 руб.