За последние 24 часа нас посетили 44838 программистов и 6343 робота. Сейчас ищут 2100 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем Steh, 11 ноя 2023.

  1. Steh

    Steh Новичок

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

    Steh Новичок

    С нами с:
    11 ноя 2023
    Сообщения:
    12
    Симпатии:
    0
    какая-то жесть, только через файл удается сконвертировать, даже строка не передается!!! почему


    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" }
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.543
    Симпатии:
    623
    Нужно больше кода видеть, телепатию запретили
     
  4. Steh

    Steh Новичок

    С нами с:
    11 ноя 2023
    Сообщения:
    12
    Симпатии:
    0
    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]);
    }
     
  5. Steh

    Steh Новичок

    С нами с:
    11 ноя 2023
    Сообщения:
    12
    Симпатии:
    0
    в общем, в этом фрагменте

    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;
    }
    и тут все
     
  6. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Steh, глазки очень уж ломаются.
    Прочитайте памятку, п.8
     
  7. Steh

    Steh Новичок

    С нами с:
    11 ноя 2023
    Сообщения:
    12
    Симпатии:
    0
    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;
    }
     
  8. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    Очень много ошибок в логике скрипта
    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. }
    .
     
  9. Steh

    Steh Новичок

    С нами с:
    11 ноя 2023
    Сообщения:
    12
    Симпатии:
    0
    а смысл использовать какие-то заготовки, если это обучение? где там ошибки в логике? Факт пишу, что кусок массива не возвращается из функции, даже в виде строки, а через файл забираю. Он выводится в конце функции. но не передается.
    --- Добавлено ---
    ну можно это все запустить в цикле без функции, и, если не будет изменений, то прекратить
     
  10. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    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. }
     
    #10 Aleksandr.B, 15 ноя 2023
    Последнее редактирование: 15 ноя 2023
  11. Steh

    Steh Новичок

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

    Код (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. //вот тут уж все, даже если не массив. а строка!  названия массива менял тут, путь через точку обозначал. объявлять пробовал до цикла. Здесь что-то мне неведомое
    --- Добавлено ---
    у меня задача не делать как угодно, а запихивать, что можно, и изучать. Может какие-то кириллические сочетания ведут так себя.
     
  12. Steh

    Steh Новичок

    С нами с:
    11 ноя 2023
    Сообщения:
    12
    Симпатии:
    0
    \
    я плюсы изучал до этого, мне в строчку удобнее, иначе я буду в 2 раза дольше все задания выполнять. Ваш код тоже не работает)) Также кусок не приходит, ну дело в символах, наверное.
    --- Добавлено ---
    вообще, спасибо всем, но не надо себя утруждать переделкой кода, я уже далеко вперед ушел, так сам бы мог. Написал на всякий случай, может кто-то сталкивался
     
  13. Drunkenmunky

    Drunkenmunky Старожил

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

    Steh Новичок

    С нами с:
    11 ноя 2023
    Сообщения:
    12
    Симпатии:
    0
    да я посимвольно разберу, когда будет нужно. В винде на опенсервере это, даже с разрывами строк проблема, приходится конвертить самому. Линь тоже есть, если что
     
  15. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    При структуре
    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 => "lite-1.png"
    13.      2 => ""
    14.    ]
    15.    1 => array:3 [▼
    16.      0 => "images/collection\lite\"
    17.      1 => "lite-2.png"
    18.      2 => ""
    19.    ]
    20.    2 => array:3 [▼
    21.      0 => "images/collection\lite\"
    22.      1 => "lite-3.png"
    23.      2 => ""
    24.    ]
    25.  ]
    26. ]
     
  16. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    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. }
     
  17. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    Есть, минимум, пару вопросов к скрипту.
    Зачем $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.         }
    собирать строку, а дальше ее парсить в массивы? Кода здесь можно собирать результирующий массив.
     
  18. Steh

    Steh Новичок

    С нами с:
    11 ноя 2023
    Сообщения:
    12
    Симпатии:
    0
    проблема на моей стороне, да, сейчас через глобальную переменную нашел вложенность массивов, а через массив такое же
    --- Добавлено ---
    там ячейки разной длины получаются из-за разной вложенности, я их скидывают в одну строку или файл и потом пересобираю
     
    #18 Steh, 17 ноя 2023
    Последнее редактирование: 17 ноя 2023
  19. Steh

    Steh Новичок

    С нами с:
    11 ноя 2023
    Сообщения:
    12
    Симпатии:
    0
    вот такой же косяк


    Код (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;
     
  20. Steh

    Steh Новичок

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