Задать вопрос
Slash-Zn
@Slash-Zn

Как составить из строки элемент массива?

Здравствуйте.
Стоит задача, составить из получаемой строки элемент массива. Допустим, есть такой массив:
$arr = [
	'k1' => [
		'k2' => [
			'k3' => [
				'k4' => 'v'
				]
			]
		]
];

Функция принимает строку:
k1/k2/k3
То есть необходимо отдать элемент:
$arr['k1']['k2']['k3']
Пробовал так:
$array = explode('/', $s);

$str = null;
foreach ($array as $k => $v)
{
	$str .= '[\'' . $v . '\']';
}

Но: "Array to string conversion in". Возможно, есть какая то функция, что как раз делает то, что мне надо?
Подскажите, пожалуйста, как можно составить из строки элемент массива?
Спасибо.
  • Вопрос задан
  • 56 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 3
liaFcipE
@liaFcipE
<?php

$string = "k1/k2/k3";
$keys = explode('/', $string);

$arr = [];

$current = &$arr;
foreach ($keys as $key) {
    $current = &$current[$key];
}

$current = "last nested item";
var_dump($arr);

/*
array(1) {
  ["k1"]=>
  array(1) {
    ["k2"]=>
    array(1) {
      ["k3"]=>
      &string(16) "last nested item"
    }
  }
}
*/


Как воображение вообще дошло до '[\'' . $v . '\']'?
Ответ написан
<?php
function getArrayValueByPath($array, $path, $separator = "/")
{
    // Разбиваем путь на ключи
    $keys = explode($separator, $path);
    // Текущий уровень массива - начинаем с корня
    $current = $array;

    foreach ($keys as $key) {
        // Если ключа нет в массиве, то выбрасываем исключение
        if (!isset($current[$key])) {
            throw new \Exception(
                "Ключ $key не найден в массиве по адресу '$path'"
            );
        }
        // Переходим к следующему уровню вложенности массива
        $current = $current[$key];
    }

    // Возвращаем значение по заданному пути
    return $current;
}

// Использование функции:

$arr = [
    "k1" => [
        "k2" => [
            "k3" => [
                "k4" => "v",
            ],
        ],
    ],
];

$result = getArrayValueByPath($arr, "k1/k2/k3");

var_dump($result);

/** Результат выполнения:

array(1) {
  ["k4"]=>
  string(1) "v"
}

*/
Ответ написан
Комментировать
<?php
$string = "k1/k2/k3";
$arr = [
	'k1' => [
		'k2' => [
			'k3' => [
				'k4' => 'v'
				]
			]
		]
];

$code = 'return $arr["'.str_replace('/', '"]["', $string).'"];';
$result = eval($code);
var_dump( $result );

Конечно, eval() - зло. Но это зло ещё живое!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы