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

12
D
На сайте с 28.06.2008
Offline
993
88

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

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')

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

W1
На сайте с 22.01.2021
Offline
0
#1
Dram :
неважно сколько в нем уровней

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

D
На сайте с 28.06.2008
Offline
993
#2
Массив может быть многомерный вложенность более 1 уровня как на примере - ["one"] -> ["gluboko"]
ArbNet
На сайте с 27.10.2019
Offline
69
#3
is_array и вызывай опять рекурсивно функцию
Блажен, кто не стремится сделать лучше: он не рискует быть не понятым.
D
На сайте с 28.06.2008
Offline
993
#4
ArbNet #:
is_array

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

D
На сайте с 28.06.2008
Offline
993
#5

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


$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
На сайте с 27.10.2019
Offline
69
#6
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));
T7
На сайте с 19.09.2018
Offline
42
#7
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
На сайте с 27.10.2019
Offline
69
#8
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;
    };
W1
На сайте с 22.01.2021
Offline
0
#9

Как-то так:

<?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, '/');
T7
На сайте с 19.09.2018
Offline
42
#10
ArbNet #:
Если не можете додуматься как путь добавить, то вот:

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

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


12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий