лучший способ преобразовать строку в массив - PullRequest
4 голосов
/ 12 февраля 2010

у меня есть массив $AR
У меня есть строка "set[0][p1]"

Когда мне дана эта строка, мне нужен лучший способ доступа к массиву на $AR['set'][0]['p1']

У меня есть полный контроль над этой строкой, поэтому мне не нужно беспокоиться об инъекциях и прочем, и я могу быть уверен, что она будет хорошо отформатирована. Нет никакого способа, которым я могу поместить p1 внутри ', чтобы быть "set[0]['p1']"

Ответы [ 4 ]

3 голосов
/ 12 февраля 2010

Моя попытка, которая должна быть в состоянии справиться с произвольным количеством [] s в строке:

Для разделения строки вы можете использовать preg_split.

$parts = preg_split('%\[?(\w+)\]?%', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

(Подробнее) полный код:

function get_value($string, $array) {
    $parts = preg_split('%\[?(\w+)\]?%', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

    foreach($parts as $part) {
        $array = $array[$part];
    }

    return $array;
}

$array = array('set'=>array(array('p1'=>'foo')));
$string = "set[0][p1]";

echo get_value($string, $array); // echoes 'foo'

Я оставляю вам обработку ошибок;)

3 голосов
/ 12 февраля 2010

Чек parse_str():

parse_str('set[0][p1]', $AR);

О, вы хотите получить доступ к индексу массива ... Вот мое мнение:

getValue($AR, array('set', 0, 'p1'));

Или, если вам действительно нужно использовать исходное строковое представление:

parse_str('set[0][p1]', $keys);
getValue($AR, $keys);

Отказ от ответственности: я не проверял это, возможно, вам придется где-то использовать array_keys().


И вспомогательная функция:

function getValue($array, $key, $default = false)
{
    if (is_array($array) === true)
    {
        settype($key, 'array');

        foreach ($key as $value)
        {
            if (array_key_exists($value, $array) === false)
            {
                return $default;
            }

            $array = $array[$value];
        }

        return $array;
    }

    return $default;
}

Я бы не стал заглядывать в эту проблему.

2 голосов
/ 12 февраля 2010

Возможно, это безумие, но вы рассматривали экстракт? Возможно, это не самое быстрое решение, но новшество в том, что ему нужен минимальный код.

extract( $AR );
$target = eval("\$set[0]['p1']");

Основное различие (с точки зрения ввода) заключается в том, что вам необходимо предварительно добавить '$' в строку и убедиться, что в скобках есть кавычки.

Основным преимуществом является то, что становится совершенно очевидно, чего вы пытаетесь достичь, и вы используете две встроенные функции PHP. Оба из них означают, что решение будет гораздо более "читаемым" для тех, кто не знаком с вашей системой.

О, и вы используете только две строки кода.

0 голосов
/ 12 февраля 2010

Тебе нужно что-то вроде. Я не на 100% уверен в скобках "[" и "]", так как раньше мне никогда не приходилось использовать для них регулярные выражения ... если это не так, может кто-нибудь исправить меня ??

foreach(preg_split('/[\[\]]/', "set[0][p1]") as $aValue) {
    $AR[$aValue[0]][$aValue[1]][$aValue[2]] = '?';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...