Какой самый простой способ преобразовать ключи массива с круглыми скобками в ключ -> подключ в php? - PullRequest
1 голос
/ 28 февраля 2012

Я возвращаю этот тип массива:

Array
(
    [data(0)] => somevalue
    [data(1)] => somevalue
    [data(2)] => somevalue
)

И мне нужно преобразовать его в следующее:

Array (
    [data] => Array (somevalue
        [0] => somevalue
        [1] => somevalue
        [2] => somevalue
    )
)

Имейте в виду, что могут быть и другие ключи, поэтому просто запуститецикл for для счетчика и подачи каждого значения в не является вариантом.

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

Данные представляют собой строку, возвращенную из PayPal.В PayPal есть функция deformatNVP (), которая выполняет начальную работу по переносу этого в массив, однако это не тот массив, который может обрабатывать PHP.Это может выглядеть так:

Array(
    [responseEnvelope.ack] => somevalue
    [responseEnvelope.timestamp] => somevalue
    [responseEnvelope.build] => somevalue
    [responseEnvelope.correlationId] => somevalue
)

У него также может быть что-то вроде:

Array(
    [personalData(0)] => somevalue
    [personalData(1)] => somevalue
    [personalData(2)] => somevalue
)

Это совершенно некрасиво, поэтому первый шаг ниже исправляет пунктирные массивы, но я остаюсь сэти ключи с круглыми скобками, чтобы иметь дело.

$data = array();
foreach ($array as $key => $value) {

    $subkey = "";
    $_keys = explode('.', $key);

    if(count($_keys) > 1){
        $key = $_keys[0];
        $subkey = $_keys[1];
    }

    if(preg_match("/([0-9]+)/", $key, $matches)){
        $key = preg_replace("/\([0-9]+\)/", "", $key);
        $data[$key][$matches[0]][$subkey] = $value;
    }
    elseif($subkey)
        $data[$key][$subkey] = $value;
    else
        $data[$key] = $value;

}
return $data;

1 Ответ

2 голосов
/ 28 февраля 2012

Иногда есть клавиши, которые пунктирны, например: key.subkey

Если может появиться что-то ., иногда могут появляться и другие вещи.Эта спецификация должна быть достаточно ясной, прежде чем разрабатывать какой-либо алгоритм для ее синтаксического анализа.

До сих пор это можно было сделать, зацикливаясь на каждом элементе и разбивая информацию с помощью функции preg_split.Следующий код помещает результирующий массив в переменную $result.

$result = array();
foreach ($array as $key => $value) {
    list($text, $subkey) = preg_split('/\W+/', "$key:END", 3, PREG_SPLIT_NO_EMPTY);
    if($subkey=='END'){
    $result[$text] = $value; continue;
    }else{
    $result[$text][$subkey] = $value;
    }
}

См. http://ideone.com/CJHHZ

Помните, что это просто разбивает строку с несловесными символами (\W).\W соответствует любым символам, кроме a-z, A-Z, 0-9 и _.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...