Почему не заполняется массив в классе и как сделать заполнение с 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);
}
}

21 Авг 2019 в 06:58
188 +1
0
Ответы
1

Проблема в вашем коде заключается в том, что метод _checkPath вызывается дважды в методе single, а это может привести к нежелательным результатам и добавлению пустых значений в массив $this->paths.

Для того чтобы исправить эту проблему, вам следует вызывать метод _checkPath только один раз в методе single и сохранять результат этого вызова в переменной, которую затем добавить в массив $this->paths.

Также, вы можете добавить callback функцию в метод _checkPath, чтобы выполнить какие-то дополнительные действия перед добавлением значения в массив $this->paths.

Пример исправленного кода:

class CheckImgPath
{
public function __construct()
{
$this->paths = [];
}
private function _checkPath($dir, $callback = null)
{
$path = scandir($dir);
$brand = '';
foreach($path as $value)
{
if ($value == '.' || $value == '..') continue;
$check = $dir."/".$value;
if (is_dir($check)) {
$this->_checkPath($check, $callback);
} else {
$brand = $check;
}
}
if ($callback) {
$callback($brand);
}
return $brand;
}
public static function checkImg($arr)
{
$single = new CheckImgPath;
$single->single($arr);
}
private function single($arr)
{
$this->_checkPath($arr, function($brand){
if($brand) {
$this->paths[] = $brand;
}
});
print_r($this->paths);
}
}

Теперь метод _checkPath вызывается только один раз в методе single, и результат добавляется в массив $this->paths с помощью callback функции.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир