Почему не заполняется массив в классе и как сделать заполнение с 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); } }
Проблема в вашем коде заключается в том, что метод _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 функции.
Проблема в вашем коде заключается в том, что метод _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 функции.