Задать вопрос
@alx1987

Как строку — Один.Два.Три преобразовать в ключи массива?

Подскажите, как на php преобразовать строку:
один.два.три
в
array[один][два][три] = [];

с учетом того, что может быть и Четыре, либо отсутствовать Три.
Т.е. мне нужно чтобы слова через точку были ключами массива

Сделал так, но это некорректно:
private function _parse_var($string, $vars = []) {
		if ( strpos($string, '.') === false ) {
			if ( array_key_exists($string, $vars) ) return $vars[$string];
		} else {
			$string = explode('.', $string);
			$string = array_filter($string);
			
			if ( count($string) == 2 ) {
				if ( isset($vars[$string[0]][$string[1]]) ) return $vars[$string[0]][$string[1]];
			} elseif ( count($string) == 3 ) {
				if ( isset($vars[$string[0]][$string[1]][$string[2]]) ) return $vars[$string[0]][$string[1]][$string[2]];
			}
		}
		return false;
	}
  • Вопрос задан
  • 212 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Denormalization
@Denormalization
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
65536
@65536
мой вариант
function &ap(&$input, $path = null, $set_value = null)
{
    if ( !is_null($path) )
    {
        if ( !is_array($path) )
        {
            $path = p2a($path);
        }

        $node = &$input;

        if ( !is_null($set_value) )
        {
            foreach ( $path as $segment )
            {
                if ( !isset($node[$segment]) || !is_array($node[$segment]) )
                {
                    $node[$segment] = false;
                }

                $node = &$node[$segment];
            }

            $node = $set_value;

            return $node;
        }
        else
        {
            foreach ( $path as $segment )
            {
                isset($node[$segment]) || $node[$segment] = null;

                $node = &$node[$segment];
            }

            return $node;
        }
    }
    else
    {
        return $input;
    }
}

function p2a($path, $separator = false)
{
    if ( $path === false || $path === '' )
    {
        return array();
    }
    else
    {
        if ( $separator )
            $separator = '/' . $separator . '/';
        else
            $separator = '/';

        return explode($separator, $path);
    }
}

использование:

получить значение узла
ap($array, 'path/to/node');
вернет $array['path']['to']['node'] или null если не существует

создать/заменить значение узла
ap($array, 'path/to/node', 'klmn');
сделает $array['path']['to']['node'] = 'klmn'

получить ссылку на узел
$link = &ap($array, 'path/to/node');

$link = 123;

$array['path']['to']['node'] станет = 123

есть один небольшой баг в виде создавания узлов со значением равным пустому массиву, к которым обращались, но которых не существовало

и нельзя обращаться (при записи) к узлу путь к которому лежит через заданное скалярное значение, то есть если path/to/node = 123, то нельзя создать узел path/to/node/some. ну тут логика вселенной, тут мои полномочия как бы всё

числовые сегменты можно использовать тоже
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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