2013-07-19 4 views
4

Я запрашиваю API и отправляет ответ JSON, который затем меняю в массив. Эта часть отлично работает, но API отправляет информацию в довольно недружественном формате.PHP, преобразование строки с помощью скобок в массив

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

Array 
(
    [name] => Name 
    [address] => 123 Street Rd 
    [products[0][product_id]] => 1 
    [products[0][price]] => 12.00 
    [products[0][name]] => Product Name 
    [products[0][product_qty]] => 1 
    [products[1][product_id]] => 2 
    [products[1][price]] => 3.00 
    [products[1][name]] => Product Name 
    [products[1][product_qty]] => 1 
    [systemNotes[0]] => Note 1 
    [systemNotes[1]] => Note 2 
) 

Теперь то, что я хотел бы сделать, это сделать это следующим образом:

Array 
(
    [name] => Name 
    [address] => 123 Street Rd 
    [product] => Array 
    (
     [0] => Array 
     (
      [product_id] => 1 
      [price] => 12.00 
      [name] => Product Name 
      [product_qty] => 1 
     ) 
     [1] => Array 
     (
      [product_id] => 2 
      [price] => 3.00 
      [name] => Product Name 
      [product_qty] => 1 
     ) 
    [systemNotes] => Array 
    (
     [0] => Note 1 
     [1] => Note 2 
    ) 
) 

Есть ли практический способ сделать это?

Спасибо!

+3

Мои соболезнования. –

+0

Является первым примером на самом деле print_r вывода? Я никогда не видел такой структуры даже с расшифрованным JSON. Если это так, добавьте образец JSON, который анализирует эту структуру, чтобы я мог правильно обмотать мой мозг. –

ответ

5

Ссылки ваш друг здесь:

$result = array(); 

foreach ($inputArray as $key => $val) { 
    $keyParts = preg_split('/[\[\]]+/', $key, -1, PREG_SPLIT_NO_EMPTY); 

    $ref = &$result; 

    while ($keyParts) { 
     $part = array_shift($keyParts); 

     if (!isset($ref[$part])) { 
      $ref[$part] = array(); 
     } 

     $ref = &$ref[$part]; 
    } 

    $ref = $val; 
} 

Demo


Однако, есть другой, гораздо простой способ, хотя это немного меньше с точки зрения функциональной сложности:

parse_str(http_build_query($inputArray), $result); 

Demo

+0

+1 - Ницца! Но это была такая редкая возможность троллировать всех «экспертов» регулярных выражений и написать регулярное выражение как '/ [] [] + /'! (Поверьте мне, это работает.) –

+0

@ acheong87 Если вам нравится первая версия, попробуйте вторую ;-) – DaveRandom

+0

Я собирался сказать, ваше редактирование взорвало мой разум. Ожидайте увеличения в других местах для компенсации. –

0

С $array вашего исходного массива:

$new_array = array("name" => $array["name"], "address" => $array["address"]); 
foreach($array["products"] AS $product) 
{ 
    $new_array["product"][] = array(
     "product_id" => $product["produit_id"], 
     "price" => $product["price"], 
     "name" => $product["name"], 
     "product_qty" => $product["product_qty"]); 
} 

foreach($array["systemNotes"] AS $note) 
{ 
    $new_array["systemNotes"][] = $note; 
} 

Это просто просматривают и создать новую структуру. ^^

Редактировать: Что-то общее может быть сделано рекурсивно. Вызов той же функции, что и просматриваемый элемент is_array, и построение нового массива в соответствии с ключами и значениями. Похоже, файловая система ^^

+0

Думаю, он ищет универсальное решение. –

+0

К сожалению, базовый массив не похож на «общий» ... Или у нас недостаточно информации о проблеме. –

+0

Я не согласен, я думаю. Я бы сказал, что общее решение было бы чем-то вроде: «Если ключ имеет сбалансированные квадратные скобки, тогда проанализируйте». Синтаксический разбор «взорвал» ключ в новый подмассив, чтобы ключ мог успешно получить доступ к его значению, поскольку сам ключ был интерполирован как переменная. –

Смежные вопросы