Перебор многомерного массива с пониманием пути PHP


Dram
90

Есть массив вида

array(2) {
  ["due"]=>
  array(3) {
    [0]=>
    string(37) "0714fdedbb5d79dcd81894276c0a202c.jpeg"
    [1]=>
    string(43) "buildings-madrid-business-spain-preview.jpg"
    [2]=>
    string(16) "black.png"
  }
  ["one"]=>
  array(2) {
    ["gluboko"]=>
    array(1) {
      [0]=>
      string(9) "donut.png"
    }
    [0]=>
    string(9) "donut.png"
  }
}

Нужно пройтись по этому массиву (неважно сколько в нем уровней), вызвав функцию ресайза изображений editSizePicture куда нужно передать полный путь до файла включая его имя.

Т.е. типа для первого файла это будет  editSizePicture (‘/due/0714fdedbb5d79dcd81894276c0a202c.jpeg’)

Не могу сообразить как это сделать?


webinfo1

Dram :
неважно сколько в нем уровней

Что Вы имеете в виду под словом «уровни»?


Dram

Массив может быть многомерный вложенность более 1 уровня как на примере — [«one»] -> [«gluboko»]


ArbNet

is_array и вызывай опять рекурсивно функцию


Dram

ArbNet #:
is_array

ничего не понял…  как тут поможет проверка на массив?


Dram

Решил вопрос проще, сам себя замудрил

$path = '/var/www/com/images/image/*'; 
$files = explode("n", trim(`find -L $path`));
foreach ($files as $file){
    if(preg_match('~.png$|.JPG$|.JPG$|.jpg$|.jpeg$|.gif$~m',$file , $match)){
    print_r($file);
  }
}


ArbNet

Dram #:

ничего не понял…  как тут поможет проверка на массив?

$arr=[
      'due'=>[
        '0714fdedbb5d79dcd81894276c0a202c.jpeg',
        'buildings-madrid-business-spain-preview.jpg',
        'black.png'
      ],
      'one'=>[
        'gluboko'=>[
          'donut.png'
        ],
        'donut.png'
      ]
    ];
    function Mf($arr){static $res=[];
      foreach($arr as $val)
        if(is_array($val))$res=$res+Mf($val);else $res[]=$val;
      return $res;
    };
    print_r(Mf($arr));


timo-71

Dram :
(‘/due/0714fdedbb5d79dcd81894276c0a202c.jpeg’)

С учетом ключей путь,  не..

ArbNet #:
 if(is_array($val))$res=$res+Mf($val);else $res[]=$val;

а тут попадет только 0714fdedbb5d79dcd81894276c0a202c.jpeg

$ php -f /var/www/php/p/public/index.php
phpversion: 8.0.2
====
Array
(
    [due] => Array
        (
            [0] => 0714fdedbb5d79dcd81894276c0a202c.jpeg
            [1] => buildings-madrid-business-spain-preview.jpg
            [2] => black.png
        )

    [one] => Array
        (
            [gluboko] => Array
                (
                    [0] => donut.png
                )

            [0] => donut.png
        )

)
Array
(
    [0] => /due/0714fdedbb5d79dcd81894276c0a202c.jpeg
    [1] => /due/buildings-madrid-business-spain-preview.jpg
    [2] => /due/black.png
    [3] => /one/gluboko/donut.png
    [4] => /one/donut.png
)

Такой результат д.б?

А принцип — да, рекурсивный обход массива..


ArbNet

timo-71 #:
а тут попадет только 0714fdedbb5d79dcd81894276c0a202c.jpeg

Я показал сам принцип, а что там ему нужно с значением сам допишет.

Если не можете додуматься как путь добавить, то вот:

function Mf($arr,$pth=''){static $res=[];
      foreach($arr as $key=>$val){
        if(is_array($val))$res=$res+Mf($val,$pth.$key.'/');
        else $res[]=$pth.$val;
      }
      return $res;
    };


webinfo1

Как-то так:

<?php
$arr=array("due"=>array(
    "0714fdedbb5d79dcd81894276c0a202c.jpeg",
    "buildings-madrid-business-spain-preview.jpg",
    "black.png"
  ),
    "one"=>array(
      "gluboko"=>array(
      "donut.png", "donut.png"
    )
  )
);


function edit_all_img($arr, $path){
    foreach($arr as $k=>$a){
        $path .= $k.'/';
        if(array_keys($a) !== range(0, count($a) - 1)){
               edit_all_img($a, $path);
        }else{          
            foreach($a as $img){
               editSizePicture ($path.$img);
            }
        }
    }
}

edit_all_img($arr, '/');


timo-71

ArbNet #:
Если не можете додуматься как путь добавить, то вот:

Как то грубовато…

Результат 9 строчек кода был показан выше. Может на скрине будет понятней…

Перебор многомерного массива с пониманием пути PHP

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

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