VicTHOR
@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);
    }
}
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
VicTHOR
@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
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Юздеск Москва
от 120 000 до 180 000 ₽
Директ Кредит Казань
от 70 000 до 120 000 ₽
Bitrix Калининград
от 100 000 до 250 000 ₽
01 дек. 2020, в 23:18
80000 руб./за проект
01 дек. 2020, в 22:41
60000 руб./за проект
01 дек. 2020, в 21:24
500 руб./за проект