Возвращается не весь массив

Изучаю чуть больше месяца, не могу передать массив целиком. Я хотел вывести путь до файлов и имена файлов. После возврата пропадает путь через 2 папки , остается корень. Структуру менял как ячейка-ячейка и ярлык-ячейка. Хоть в файл сбрасывается, да и ладно)
И почему-то
is_file else
это не
is_file is_dir

 

какая-то жесть, только через файл удается сконвертировать, даже строка не передается!!! почему

foreach ($b as $as) {var_dump($as); echo ‘<br>’;}
return $b;
}

$b=listr(‘c:\OSPanel\domains\localhost’);
foreach ($b as $as) {var_dump($as); echo ‘<br>’;}

Вот это исчезает:

array(3) { [0]=> string(37) «c:\OSPanel\domains\localhost\script1\» [1]=> string(15) «4433863154.webp» }
array(3) { [0]=> string(37) «c:\OSPanel\domains\localhost\script1\» [1]=> string(14) «image (1).webp» }
array(3) { [0]=> string(37) «c:\OSPanel\domains\localhost\script1\» [1]=> string(10) «image.webp» }
array(3) { [0]=> string(37) «c:\OSPanel\domains\localhost\script1\» [1]=> string(66) «x7d7aa4a48bda7112450f98c413c821f2.jpg.pagespeed.ic.ClgDe_4QLZ.webp» }
array(3) { [0]=> string(34) «c:\OSPanel\domains\localhost\view\» [1]=> string(39) «Безымянный45 (3) (1) (28).jpg» }
array(3) { [0]=> string(34) «c:\OSPanel\domains\localhost\view\» [1]=> string(39) «Безымянный45 (3) (1) (29).jpg» }
array(3) { [0]=> string(34) «c:\OSPanel\domains\localhost\view\» [1]=> string(39) «Безымянный45 (3) (1) (30).jpg» }

А это сразу снизу остается?
array(3) { [0]=> string(29) «c:\OSPanel\domains\localhost\» [1]=> string(15) «4433863154.webp» }
array(3) { [0]=> string(29) «c:\OSPanel\domains\localhost\» [1]=> string(12) «7257_001.gif» }
array(3) { [0]=> string(29) «c:\OSPanel\domains\localhost\» [1]=> string(39) «DisastrousQuaintBangeltiger-max-1mb.gif» }
array(3) { [0]=> string(29) «c:\OSPanel\domains\localhost\» [1]=> string(6) «b3.jpg» }
array(3) { [0]=> string(29) «c:\OSPanel\domains\localhost\» [1]=> string(9) «eath2.gif» }
array(3) { [0]=> string(29) «c:\OSPanel\domains\localhost\» [1]=> string(14) «image (1).webp» }
array(3) { [0]=> string(29) «c:\OSPanel\domains\localhost\» [1]=> string(10) «image.webp» }
array(3) { [0]=> string(29) «c:\OSPanel\domains\localhost\» [1]=> string(15) «Слой 18.gif» }

 

Нужно больше кода видеть, телепатию запретили

 

function listr($a){
$c=array_diff(scandir($a), [‘..’,’.’]);
$b=[];$l=»;
foreach ($c as $as) {$d=$a.’\\’.$as;if(is_dir($d)) $c[]=listr($d);
if(preg_match(‘#\.jpg|\.gif|\.webp#’, $as)){$l.=$a.’\\;’.$as.»\n»;}

}
$a=strlen($l); $d=»;$h=»; $f=0;
for ($i=0; $i <$a ; $i++) {$h=substr($l, $i ,1);if($h==’;’) {$b[$f][0]=$d; $d=»; } elseif($h==»\n» or $i==$a-1) {$b[$f][1]=$d;$b[$f][2]=»; $d=»; $f++;} else $d.=$h;
}
//foreach ($b as $as) {var_dump($as); echo ‘<br>’;}

return $b;
}

$b=listr(‘c:\OSPanel\domains\localhost’);
//foreach ($b as $as) {var_dump($as); echo ‘<br>’;}
$a=count($b);$c=0;
for ($i=0; $i < $a; $i++) {
$b[$i][2]=new_name($b[$i][1],$b,0);

}

function new_name($e,$b,$c){
$a=count($b);

for($j=0;$j<$a;$j++){
if($e==$b[$j][2]) {$c++;$e=$e.’_’.$c; new_name($e,$b,$c); }

}return $e;

}

for ($i=0; $i < $a; $i++) {
copy($b[$i][0].$b[$i][1], ‘c:\OSPanel\domains\localhost\image\\’.$b[$i][2]);
}

 

в общем, в этом фрагменте

function listr($a){
$c=array_diff(scandir($a), [‘..’,’.’]); // пути дергаем
$b=[];$l=»;
foreach ($c as $as) {$d=$a.’\\’.$as;if(is_dir($d)) $c[]=listr($d); //папки снова отправляем
if(preg_match(‘#\.jpg|\.gif|\.webp#’, $as)){$l.=$a.’\\;’.$as.»\n»;} //файлы отбираем, закидываем исходный путь и найденный файл через разделитель

}
//задание скинуть в папку и уникализировать имена, в оригинальном массиве ячейки разного размера
$a=strlen($l); $d=»;$h=»; $f=0;
for ($i=0; $i <$a ; $i++) {$h=substr($l, $i ,1);if($h==’;’) {$b[$f][0]=$d; $d=»; } elseif($h==»\n» or $i==$a-1) {$b[$f][1]=$d;$b[$f][2]=»; $d=»; $f++;} else $d.=$h; //формируем массив с 3-я ячейками, третья — это для итоговых имен файлов, т. к будет рекурсивный подбор приставок _1, _2 в случае совпадения имен
}
//foreach ($b as $as) {var_dump($as); echo ‘<br>’;}

return $b;
}
и тут все

 

@Steh, глазки очень уж ломаются.
Прочитайте памятку, п.8

 

function listr($a){
$c=array_diff(scandir($a), [‘..’,’.’]); // пути дергаем
$b=[];$l=»;
foreach ($c as $as) {$d=$a.’\\’.$as; //полный путь
if(is_dir($d)) $c[]=listr($d); //папки снова отправляем на скан
if(preg_match(‘#\.jpg|\.gif|\.webp#’, $as)) //если картинки
{$l.=$a.’\\;’.$as.»\n»;} //записываем в переменную построчно через разделитель точку с запятой на разных строках путь и имя файла

}
//задание скинуть в папку и уникализировать имена, в оригинальном массиве получились ячейки разного размера, по
тому приведем в порядок
$a=strlen($l); $d=»;$h=»; $f=0; //готовим цикл по все длине переменной и раскидываем в 2 колонки путь и название картинки
for ($i=0; $i <$a ; $i++)
{$h=substr($l, $i ,1);if($h==’;’) //если разделитель
{$b[$f][0]=$d; $d=»; } // заносив первую ячейку и очищаем накопленное.
elseif($h==»\n» or $i==$a-1) // если новая строка или конец переменной
{$b[$f][1]=$d;$b[$f][2]=»; $d=»; $f++;} // заносим во вторую ячейку имя файла, сразу формируем третью ячейку для итогового имени (точно не в этом дело) . ну и двигаем индекс массива
else $d.=$h; //иначе рабочий процесс накопления символов до разделителя
}
//foreach ($b as $as) {var_dump($as); echo ‘<br>’;}

return $b;
}

 

Очень много ошибок в логике скрипта

PHP:
  1. function listr($path)
  2. {
  3.     $result = [];
  4.     $Iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
  5.     foreach ($Iterator as $value){
  6.         /**@var SplFileInfo $value*/
  7.         if(in_array($value->getExtension(), [‘png’, ‘jpg’, ‘webp’])){
  8.             $result[] = [
  9.                 $value->getPath(),
  10.                 $value->getFilename()
  11.             ];
  12.         }
  13.     }
  14.     return $result;
  15. }

.

 

а смысл использовать какие-то заготовки, если это обучение? где там ошибки в логике? Факт пишу, что кусок массива не возвращается из функции, даже в виде строки, а через файл забираю. Он выводится в конце функции. но не передается.
— Добавлено —
ну можно это все запустить в цикле без функции, и, если не будет изменений, то прекратить

 

1. Функция не должна делать много. Нужно разделить логику на чтение директории и парсинг строк.
2. Править то что работает неправильно в функции listr, если это необходимо
3. Рефакторинг.

PHP:
  1. function recursiveReadFilesFordirs($a)
  2. {
  3.     $c = array_diff(scandir($a), [‘..’, ‘.’]);
  4.     $l = »;
  5.     foreach ($c as $as) {
  6.         $d = $a . ‘\\’ . $as;
  7.         if (is_dir($d)) {
  8.             $l.= recursiveReadFilesFordirs($d);
  9.         }
  10.  
  11.         if (preg_match(‘#\.php|\.gif|\.webp#’, $as)) {
  12.             $l .= $a . ‘\\;’ . $as . «\n«;
  13.         }
  14.     }
  15.     return $l;
  16. }
  17.  
  18. function listr($a)
  19. {
  20.     $b = [];
  21.     $l = recursiveReadFilesFordirs($a);
  22.  
  23.     $a = strlen($l);
  24.     $d = »;
  25.     $h = »;
  26.     $f = 0;
  27.     for ($i = 0; $i < $a; $i++) {
  28.         $h = substr($l, $i, 1);
  29.         if ($h == ‘;’) {
  30.             $b[$f][0] = $d;
  31.             $d = »;
  32.         } elseif ($h == «\n« || $i == $a 1) {
  33.             $b[$f][1] = $d;
  34.             $b[$f][2] = »;
  35.             $d = »;
  36.             $f++;
  37.         } else {
  38.             $d .= $h;
  39.         }
  40.     }
  41.  
  42.  
  43. //foreach ($b as $as) {var_dump($as); echo ‘<br>’;}
  44.  
  45.     return $b;
  46. }
 

я присваивал результаты другому массиву и пытался вернуть. не возвращает кусок, я обнулял массив, он неравномерный, вот в чем дело, может тогда без функции в цикле надо делать. Не понимаю, что внутри происходит, разделители менял, что мог, выносил за пределы функций. Вот смотрите:

Код (Text):
  1.  
  2. $a=strlen($l); $d=»;$h=»»; $f=0; $b=[]; //вот обнуляю,
  3. //готовим цикл по все длине переменной и раскидываем в 2 колонки путь и название картинки
  4. for ($i=0; $i <$a ; $i++)
  5. {$h=substr($l, $i ,1);if($h==’;’) //если разделитель
  6. {$b[$f][0]=$d; $d=»; } // заносив первую ячейку и очищаем накопленное.
  7. elseif($h==»\n» or $i==$a-1) // если новая строка или конец переменной
  8. {$b[$f][1]=$d;$b[$f][2]=»; $d=»; $f++;} // заносим во вторую ячейку имя файла, сразу формируем третью ячейку для итогового имени (точно не в этом дело) . ну и двигаем индекс массива
  9. else $d.=$h; //иначе рабочий процесс накопления символов до разделителя
  10. }
  11. //foreach ($b as $as) {var_dump($as); echo ‘<br>’;}
  12.  
  13. return $b;
  14. }

— Добавлено —
оно работает правильно! до return массив нормальный, после приходит только кусок.
— Добавлено —

Код (Text):
  1. //foreach ($b as $as) {var_dump($as); echo ‘<br>’;}
  2. // вот тут все правильно,
  3.  
  4. return $b;
  5. }
  6.  
  7.  
  8. $b=listr(‘c:\OSPanel\domains\localhost’);
  9. //foreach ($b as $as) {var_dump($as); echo ‘<br>’;}
  10. //вот тут уж все, даже если не массив. а строка!  названия массива менял тут, путь через точку обозначал. объявлять пробовал до цикла. Здесь что-то мне неведомое

— Добавлено —
у меня задача не делать как угодно, а запихивать, что можно, и изучать. Может какие-то кириллические сочетания ведут так себя.

 

\

я плюсы изучал до этого, мне в строчку удобнее, иначе я буду в 2 раза дольше все задания выполнять. Ваш код тоже не работает)) Также кусок не приходит, ну дело в символах, наверное.
— Добавлено —
вообще, спасибо всем, но не надо себя утруждать переделкой кода, я уже далеко вперед ушел, так сам бы мог. Написал на всякий случай, может кто-то сталкивался

 

Возможно. Зависит от файловой системы для указанного пути. Если NTFS, то следует применять мультибайтные функции https://www.php.net/manual/ru/ref.mbstring.php

 

да я посимвольно разберу, когда будет нужно. В винде на опенсервере это, даже с разрывами строк проблема, приходится конвертить самому. Линь тоже есть, если что

 

При структуре
dir collection
->dir lite
->->file «lite-1.jpg»
->->file «lite-2.jpg»
->->file «lite-3.jpg»
->file additional.jpg
->file «eco.png»
->file «lite»
->file «lite.png»
->file «optim.png»
->file «rigid.png»
->file «strong.png»

После вызова в цикле:
$c[] = listr($d);
$c содержит:

PHP:
  1. array:8 [
  2.   2 => «additional.jpg»
  3.   3 => «eco.png»
  4.   4 => «lite»
  5.   5 => «lite.png»
  6.   6 => «optim.png»
  7.   7 => «rigid.png»
  8.   8 => «strong.png»
  9.   9 => array:3 [
  10.     0 => array:3 [
  11.       0 => «images/collection\lite
  12.      1 => «lite1.png«
  13.      2 => ««
  14.    ]
  15.    1 => array:3 [▼
  16.      0 => «images/collection\lite\«
  17.      1 => «lite2.png«
  18.      2 => ««
  19.    ]
  20.    2 => array:3 [▼
  21.      0 => «images/collection\lite\«
  22.      1 => «lite3.png«
  23.      2 => ««
  24.    ]
  25.  ]
  26. ]
 

PHP:
  1. function listr($a, &$b = []){
  2.     $c = array_diff(scandir($a), [‘..’, ‘.’]); // пути дергаем
  3.  
  4.     $l = »;
  5.     foreach ($c as $as) {
  6.         $d = $a . ‘\\’ . $as;
  7.         if (is_dir($d)) {
  8.             $c[] = listr($d, $b);
  9.         } //папки снова отправляем
  10.         if (preg_match(‘#\.jpg|\.gif|\.webp|\.png#’, $as)) {
  11.             $l .= $a . ‘\\;’ . $as . «\n«;
  12.         } //файлы отбираем, закидываем исходный путь и найденный файл через разделитель
  13.     }
  14.  
  15.     $a = strlen($l);
  16.  
  17.     $d = »;
  18.     $h = »;
  19.     $f = count($b);
  20.     for ($i = 0; $i < $a; $i++) {
  21.         $h = substr($l, $i, 1);
  22.         if ($h == ‘;’) {
  23.             $b[$f][0] = $d;
  24.             $d = »;
  25.         } elseif ($h == «\n« or $i == $a 1) {
  26.             $b[$f][1] = $d;
  27.             $b[$f][2] = »;
  28.             $d = »;
  29.             $f++;
  30.         } else {
  31.             $d .= $h;
  32.         }
  33.     }
  34.  
  35.     return $b;
  36. }
 

Есть, минимум, пару вопросов к скрипту.
Зачем $c[] = listr($d, $b);, если это не будет использоваться далее?
Думаю, в контексте данного скрипта, логичнее

Код (Text):
  1.  if (is_dir($d)) {
  2.             listr($d, $b);
  3.             continue;
  4. }

Зачем здесь

PHP:
  1.  if (preg_match(‘#\.jpg|\.gif|\.webp|\.png#’, $as)) {
  2.             $l .= $a . ‘\\;’ . $as . «\n«;
  3.         }

собирать строку, а дальше ее парсить в массивы? Кода здесь можно собирать результирующий массив.

 

проблема на моей стороне, да, сейчас через глобальную переменную нашел вложенность массивов, а через массив такое же
— Добавлено —

там ячейки разной длины получаются из-за разной вложенности, я их скидывают в одну строку или файл и потом пересобираю

 

вот такой же косяк

Код (Text):
  1.  
  2.  
  3. $a=[
  4.     [11, [
  5.     [11, 32, 13, 44, 55],
  6.     [31, 42, 53, 66, 75],
  7.     [12, 26, 33, 45, 52],
  8.     [15, 22, 35, 64, 57],
  9.     [21, 52, 32, 44, 38],
  10. ], 13, 44, 55],
  11.     [31, 42, 53, 66, 75],
  12.     [12, 26, 33, 45, 52],
  13.     [15, 22, 35, 64, 57],
  14.     [21, 52, 32, 44, 38],
  15. ];
  16.  
  17.  
  18. $k=1; $e=[];
  19.  
  20. function f($a,$k,$e){
  21.  
  22. foreach ($a as $as){
  23. if(is_array($as)){
  24.     $k++;//считаем глубину путей
  25.     $e[]=$k;//скидываем вариант в массив
  26.      f($as,$k,$e); //отправляем с новыми данными
  27.     }
  28.  
  29. }
  30. var_dump ($e); return ($e);
  31.  
  32.  
  33. }
  34.  
  35. $e=f($a,$k,$e);
  36. var_dump ($e); //батоны
  37.  
  38.  
  39. $a=0;
  40. foreach ($e as $as) {if ($as>$a) $a=$as;   //выбираем большую вложенность
  41. }
  42. echo $a;
 

получается, когда массив глобальный
— Добавлено —
похоже, var_dump собирает все в массив глобальный, потом выводит, а по факту все в локальном и последняя ветка приходит. В var_dump дофига лишних данных заметил, видимо, гребет все в подряд, ну, можно и свою функцию вывода через echo сделать, но решение найдено. Мораль — не верьте var_dump ))

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *