Подставить адрес в массиве PHP

146
08 ноября 2019, 10:40

Можно ли в PHP подставить адрес массиву?

Например вот структура $_FILE, что бы получить имя и размер файлов в портфолио массив будет выглядеть так:

$_FILE['name'][7]['portfolio'][0];
$_FILE['size'][7]['portfolio'][0];

Могу ли я каким нибудь образом поместить адрес [7]['portfolio'][0] в переменную и сделать, как то так?

$a = [7]['portfolio'][0];
$_FILE['name'].$a;
// P.S. Понимаю что это работать не будет, можно и что то подобное сделать?

-

[name] => Array(
        [6] => Array(
                [layer] => Снимок экрана (10).png
                [size] => whois_2.png
            )
        [7] => Array(
                [portfolio] => Array(
                        [0] => 2whois.png
                        [1] => DNS.png
                    )
            )
    )
...
[size] => Array(
        [6] => Array(
                [layer] => Снимок экрана (10).png
                [size] => whois_2.png
            )
        [7] => Array(
                [portfolio] => Array(
                        [0] => 2whois.png
                        [1] => DNS.png
                    )
            )
    )
Answer 1

Обновлено: позволяет определять не все ключи.

Можно воспользоваться для вашей задачи замыканием (Closure). Вот вариант:

<?php
function fixOffsets($k1, $k2 = null, $k3 = null)
{
    return function (array $arr) use ($k1, $k2, $k3) {
        $res = $arr[$k1] ;
        if ($k2 === null) return $res;
        $res = $res[$k2] ; 
        if ($k3 === null) return $res;
        return $res[$k3];
    };
};
$a = [
    'name' => [
        6 => [
            'layer' => "Снимок экрана (10).png",
            'size' => "3whois_2.png"
        ],
        7 => [
            'portfolio' => [
                0 => "whois.png",
                1 => "DNS.png"
            ]
        ]
    ],
    'size' => [
        6 => [
            'layer' => "Снимок экрана (10).png",
            'size' => "4whois_2.png"
        ],
        7 => [
            'portfolio' => [
                0 => "2whois.png",
                1 => "2DNS.png"
            ]
        ]
    ]
];
$extractor = fixOffsets(7, 'portfolio', 0);
var_dump($extractor($a['name']));
var_dump($extractor($a['size']));
$extractor = fixOffsets(6, 'size' );
var_dump($extractor($a['name']));
var_dump($extractor($a['size']));

Описание:

Вызов функции fixOffsets($k1, $k2, $k3) возвращает функцию-замыкание,у которой в области видимости зафиксированны переменные $k1, $k2, $k3 и которая:

  • ожидает параметр - многомерный ассоциативный массив;

  • возвращает требуемое значение из массива, переданного в качестве аргумента, используя переменные $k1, $k2, $k3 как ключи. Два последних ключа являются необязательными.

Песочница

Answer 2

Доработанный ответ

Можно воспользоваться для вашей задачи замыканием (Closure). Вот вариант:

@Jigius

<?php
function fixOffsets(array $path)
{
  return function (array $arr) use ($path) {
    foreach($path as $val)
      if(empty($val)) return $arr;
      else $arr = $arr[$val];          
    return $arr;
  };
};
$a = [
  'name' => [
    6 => [
        'layer' => "Снимок экрана (10).png",
        'size' => "whois_2.png"
    ],
    7 => [
        'portfolio' => [
            0 => "2whois.png",
            1 => "DNS.png"
        ]
    ]
],
'size' => [
    6 => [
        'layer' => "Снимок экрана (10).png",
        'size' => "whois_2.png"
    ],
    7 => [
        'portfolio' => [
            0 => "2whois.png",
            1 => "2DNS.png"
        ]
    ]
  ]
];

//var_dump($a['name'][7]['portfolio'][0]);
//var_dump($a['size'][7]['portfolio'][0]);
$extractor = fixOffsets(array(7, 'portfolio', 0));
var_dump($extractor($a['name']));
var_dump($extractor($a['size']));
$extractor = fixOffsets(array(6, 'layer'));
var_dump($extractor($a['name']));
var_dump($extractor($a['size']));

А какие еще варианты решения данной задачи могут быть?

READ ALSO
CodeIgniter route localhost 404

CodeIgniter route localhost 404

Следуя по примерам из учебника в документации я переписал routesphp соответствующим образом:

138
PHP замена текста из массива файлов

PHP замена текста из массива файлов

Есть форма с двумя инпутами - исходное значение и заменяемое, форма отправляет GET в файл replacephp

146
Проблема запуска внешнего bash скрипта из PHP

Проблема запуска внешнего bash скрипта из PHP

Есть php скрипт, вот кусок кода из него

137