Динамическое добавление/получение значений из массива

234
09 августа 2017, 20:42

У меня есть есть строка(паттерн):

$pattern = 'config.images.0.width';

Мне нужно динамически на основе этого паттерна построить массив, чтобы получилось следующие:

$arr['config']['images'][0]['width'] = 500;
$width = $arr['config']['images'][0]['width'];

Как видно, "руками" - это сделать не проблема но как это сделать динамически?

Answer 1
$pattern = 'config.images.0.width';
$value = 400;
$keys = explode('.', $pattern);
$arr=[];
function addInner($keys, &$arr, $value){
    $key = array_shift($keys);
    $arr[$key] = null;
    if(empty($keys)) {
        $arr[$key] = $value;
        return;
    }
    addInner($keys, $arr[$key], $value);
}
addInner($keys, $arr, $value);

sandbox

Answer 2
function getValueByPath($path, $array) {
    $tmp = &$array;
    foreach($path as $key) {
        $tmp =& $tmp[$key];
    }
    return $tmp;
}
//-----------------------------------------
// input
$arr = ['f1' => 1,
        'config' => [
            'videos' => 'http://video.ru',
            'images' => [
                ['width' => 100, 'height' => 80 ], 
                ['width' => 666, 'height' => 1 ], 
                ['width' => 0, 'height' => 0 ], 
            ]
        ],
        'f3' => null
];        
$key = 'config.images.0.width';
$path = explode('.', $key);
// output
$result = getValueByPath($path, $arr); 
echo $result;  // 100

http://sandbox.onlinephpfunctions.com/code/bd93fccc8070b46ec246e2aa460ddadc1bd117e1

Подсмотрено на https://stackoverflow.com/a/27930028/6104996

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

  • 0 шаг (до цикла):

    $tmp = ['f1' => 1,
            'config' => [
                'videos' => 'http://video.ru',
                'images' => [
                    ['width' => 100, 'height' => 80 ], 
                    ['width' => 666, 'height' => 1 ], 
                    ['width' => 0, 'height' => 0 ], 
                ]
            ],
            'f3' => null
    ]; 
    
  • 1 итерация ($tmp['config'])

    $tmp = ['videos' => 'http://video.ru',
            'images' => [
                ['width' => 100, 'height' => 80 ], 
                ['width' => 666, 'height' => 1 ], 
                ['width' => 0, 'height' => 0 ], 
            ]
    ];
    
  • 2 итерация ($tmp['images'])

    $tmp = [
            ['width' => 100, 'height' => 80 ], 
            ['width' => 666, 'height' => 1 ], 
            ['width' => 0, 'height' => 0 ],                 
    ];
    
  • 3 итерация ($tmp[0])

    $tmp = ['width' => 100, 'height' => 80 ];
    
  • 4 итерация ($tmp['width'])

    $tmp = 100;
    
READ ALSO
Передать значение checkbox методом POST в цикле

Передать значение checkbox методом POST в цикле

Добрый деньЕсть одна проблема

252
Ошибка 0xC0000005

Ошибка 0xC0000005

Пишу стек на плюсахExeшник компилится и крашится с ошибкой 0xC0000005

360
Аналог Object.Equals на C++?

Аналог Object.Equals на C++?

Нужно сравнить два объекта в шаблонном методеВ C# я бы написал:

371
Проблемы с библиотекой (arduino)

Проблемы с библиотекой (arduino)

Есть библиотека: DynamicCollectionh DynamicCollection

280