Почему не заполняется массив в классе и как сделать заполнение с 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
216 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир