Как преобразовать строку в массив в PHP? - PullRequest
3 голосов
/ 18 марта 2011

У меня есть эта строка:

0=&task=rose&duration=1.25&user=15&1=&task=daisy&duration=0.75&user=25&2=&task=orchid&duration=1.15&user=7

Я хочу эту структуру массива:

array(
    array( "task" => "rose", 
           "duration" => 1.25,
           "user" => 15 
         ),
    array( "task" => "daisy", 
           "duration" => 0.75,
           "user" => 25,
         ),
    array( "task" => "orchid", 
           "duration" => 1.15,
           "user" => 7 
         )
      )

Ответы [ 6 ]

2 голосов
/ 18 марта 2011

Теперь parse_url не будет работать для вашего случая, так как будет перезаписывать дублирующиеся записи. Вы должны вручную извлечь и сгруппировать здесь.

$str = 'decoded_name=0=&task=rose&duration=1.25&user=15&1=&task=daisy&duration=0.75&user=25&2=&task=orchid&duration=1.15&user=7';
preg_match_all('#(\w+)=([^&=]*)(?:&|$)#', $str, $matches, PREG_SET_ORDER); 

$result = array();
$i = 0;    
foreach ($matches as $m) {
    list(, $key, $value) = $m;

    if (!strlen($value)) { 
       $i = (int)$key;
    }
    else {
       $result[$i][$key] = $value;
    }
}

Хитрость заключается в том, чтобы следить за числовыми клавишами (без значения), которые разделяют ваши группы. Цикл сгенерирует следующий вложенный массив:

[0] => Array
    (
        [task] => rose
        [duration] => 1.25
        [user] => 15
    )

[1] => Array
    (
        [task] => daisy
        [duration] => 0.75
        [user] => 25
    )

[2] => Array
    (
        [task] => orchid
        [duration] => 1.15
        [user] => 7
    )
1 голос
/ 18 марта 2011

Вы не можете достичь того, что хотите, используя заголовки, отправляемые, поскольку $ _GET ['user'] будет равно 7 (предыдущие будут перезаписаны. Вам понадобится строка запроса, подобная этой, чтобы пройти по этому маршруту.).

decoded_name=0=&task[]=rose&duration[]=1.25&user[]=15&1=&task[]=daisy&duration[]=0.75&user[]=25&2=&task[]=orchid&duration[]=1.15&user[]=7

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

1 голос
/ 18 марта 2011

Я с радостью помогу!

<?php

$input = 'data[0][task]=rose&data[0][duration]=1.25&data[0][user]=15&' .
         'data[1][task]=daisy&data[1][duration]=0.75&data[1][user]=25&' .
         'data[2][task]=orchid&data[2][duration]=1.15&data[2][user]=7';

$output = array();

parse_str($input, $output);

print_r($output);

hopeseekr@7250MHz ~ $ php stack_5350749.php
Array
(
    [data] => Array
        (
            [0] => Array
                (
                    [task] => rose
                    [duration] => 1.25
                    [user] => 15
                )

            [1] => Array
                (
                    [task] => daisy
                    [duration] => 0.75
                    [user] => 25
                )

            [2] => Array
                (
                    [task] => orchid
                    [duration] => 1.15
                    [user] => 7
                )

        )

)

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

0 голосов
/ 10 августа 2013

Попробуйте отредактировать ваш ввод / текстовое поле в форме из name="task" в name="data[task]"

, тогда вы увидите свои данные в var_dump($_GET)

0 голосов
/ 18 марта 2011
$str = "decoded_name=0=&task=rose&duration=1.25&user=15&1=&task=daisy&duration=0.75&user=25&2=&task=orchid&duration=1.15&user=7";

$str = preg_replace("/&\d=/", "", $str);
$str = preg_replace("/&/", "=", $str);
$tmp = preg_split("/=+/", $str);

$length = count($tmp);

for ($i = 2, $j = 0; $i < $length; $i+=6, $j++) {
    $arr[$j] = array($tmp[$i] => $tmp[$i + 1], $tmp[$i + 2] => $tmp[$i + 3], $tmp[$i + 4] => $tmp[$i + 5]);
}

print_r($arr);
0 голосов
/ 18 марта 2011

Вот решение без регулярных выражений. Я чувствую себя более комфортно с этим.

$str = 'decoded_name=0=&task=rose&duration=1.25&user=15&1=&task=daisy&duration=0.75&user=25&2=&task=orchid&duration=1.15&user=7';

// Get rid of "decoded_name", which we don't need
$str = str_replace('decoded_name=', '', $str);

$arr = explode('&', $str);
array_push($arr, '0='); // Add sentinel value to simplify the loop
$results = array();
$parsing = array();

foreach ($arr as $item) {
    // If a new task begins
    if (strspn($item, '0123456789') == strlen($item) - 1) {
        // Add the current item if there is one
        if (!empty($parsing)) {
            $results[] = $parsing;
        }

        // Prepare to parse another item
        $parsing = array();
        continue;
    }

    // Add data to the current item    
    list($key, $value) = explode('=', $item);
    $parsing[$key] = $value;
}

Смотрите это в действии здесь .

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