@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;
	}
  • Вопрос задан
  • 206 просмотров
Решения вопроса 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. ну тут логика вселенной, тут мои полномочия как бы всё

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

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

Войти через центр авторизации
Похожие вопросы