У меня есть есть строка(паттерн):
$pattern = 'config.images.0.width';
Мне нужно динамически на основе этого паттерна построить массив, чтобы получилось следующие:
$arr['config']['images'][0]['width'] = 500;
$width = $arr['config']['images'][0]['width'];
Как видно, "руками" - это сделать не проблема но как это сделать динамически?
$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
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;
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты