2015-12-02 4 views
1

Я хотел бы создать JSON из массива определенным образом. Мой массив выглядит следующим образом в начале:PHP: Генерировать JSON из массива определенным образом

array(2) { 
    [22]=> 
    array(8) { 
    ["factor"]=> 
    array(2) { 
     [0]=> 
     string(2) "12" 
     [1]=> 
     string(1) "1" 
    } 
    ["unit"]=> 
    array(2) { 
     [0]=> 
     string(6) "months" 
     [1]=> 
     string(5) "times" 
    } 
    ["value"]=> 
    array(2) { 
     [0]=> 
     string(3) "2.5" 
     [1]=> 
     string(1) "2" 
    } 
    ["planid"]=> 
    array(2) { 
     [0]=> 
     string(1) "1" 
     [1]=> 
     string(1) "1" 
    } 
    ["position"]=> 
    array(2) { 
     [0]=> 
     string(22) "Test 1" 
     [1]=> 
     string(21) "Test 2" 
    } 
    ["vouchervalue"]=> 
    array(2) { 
     [0]=> 
     string(1) "0" 
     [1]=> 
     string(1) "0" 
    } 
    ["vouchertype"]=> 
    array(2) { 
     [0]=> 
     string(0) "" 
     [1]=> 
     string(0) "" 
    } 
    ["vat"]=> 
    array(2) { 
     [0]=> 
     int(19) 
     [1]=> 
     int(19) 
    } 
    } 
    [23]=> 
    array(8) { 
    ["factor"]=> 
    array(2) { 
     [0]=> 
     string(2) "12" 
     [1]=> 
     string(1) "1" 
    } 
    ["unit"]=> 
    array(2) { 
     [0]=> 
     string(6) "months" 
     [1]=> 
     string(5) "times" 
    } 
    ["value"]=> 
    array(2) { 
     [0]=> 
     string(3) "2.5" 
     [1]=> 
     string(1) "2" 
    } 
    ["planid"]=> 
    array(2) { 
     [0]=> 
     string(1) "1" 
     [1]=> 
     string(1) "1" 
    } 
    ["position"]=> 
    array(2) { 
     [0]=> 
     string(22) "Test 3" 
     [1]=> 
     string(21) "Test 4" 
    } 
    ["vouchervalue"]=> 
    array(2) { 
     [0]=> 
     string(1) "0" 
     [1]=> 
     string(1) "0" 
    } 
    ["vouchertype"]=> 
    array(2) { 
     [0]=> 
     string(0) "" 
     [1]=> 
     string(0) "" 
    } 
    ["vat"]=> 
    array(2) { 
     [0]=> 
     int(19) 
     [1]=> 
     int(19) 
    } 
    } 
} 

Это как JSON выглядит следующим образом:

string(354) "{"factor":[["12","1"],["12","1"]],"unit":[["months","times"],["months","times"]],"value":[["2.5","2"],["2.5","2"]],"planid":[["1","1"],["1","1"]],"position":[["Test 1","Test 2"],["Test 3","Test 4"]],"vouchervalue":[["0","0"],["0","0"]],"vouchertype":[["",""],["",""]],"vat":[[19,19],[19,19]]}" 

Но я хотел бы, чтобы это так:

string(214) "{"factor":["12", "1","12","1"],"unit":["months", "times","months","times"],"value":["2.5","2","2.5", "2"],"planid":["1","1","1","1"],"position":["Test 1","Test 2", "Test 3", "Test 4"],"vouchervalue":["0","0","0","0"],"vouchertype":["","","",""],"vat":[19,19,19,19]}" 

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

Ну, я понятия не имею, как решить эту проблему, так что я рад любой намек :-)

+4

Придумай другое массив и 'json_encode'. –

+0

Привет, как должен выглядеть другой массив, чтобы я мог его кодировать таким образом? – MyFault

+1

json_encode будет кодировать только массив, как есть, если он построен. Если вы хотите, чтобы массив «factor» включал все элементы, вам нужно создать массив, который включает в себя все факторы, а не два массива, каждый из которых содержит факторы ... Имеете смысл? –

ответ

0

Допустим, у вас есть данные в массив $ а.

$a = array( 
    array( 
     'factor'=> array('12', '1'), 
     'unit'=> array('months', 'times'), 
     'value'=> array('2.5', '2'), 
     'planid'=> array('1', '1'), 
     'position'=> array('Test 1', 'Test 2'), 
     'vouchervalue'=> array('0', '0'), 
     'vouchertype'=> array('', ''), 
     'vat'=> array(19, 19), 
    ), 
    array( 
     'factor'=> array('12', '1'), 
     'unit'=> array('months', 'times'), 
     'value'=> array('2.5', '2'), 
     'planid'=> array('1', '1'), 
     'position'=> array('Test 3', 'Test 4'), 
     'vouchervalue'=> array('0', '0'), 
     'vouchertype'=> array('', ''), 
     'vat'=> array(19, 19), 
    ), 
); 

Это в вашем примере содержит два массива, которые вы хотите объединить. Это один из способов:

$b = array(); 
foreach($a[0] as $k=>$v) { 
    if (isset($a[1][$k])) // Add keys in both arrays 
     $b[$k] = array_merge($a[0][$k], $a[1][$k]); 
    else      // Add keys in only first array 
     $b[$k] = $a[0][$k]; 
} 
foreach($a[1] as $k=>$v) { 
    if (!isset($a[0][$k])) // Add keys in only second array 
     $b[$k] = $a[1][$k]; 
} 
echo json_encode($b); 

Это итерация через первый массив. Если ключ («коэффициент», «единица») доступен в обоих массивах, он объединяет их, иначе он просто добавляет массив.

Во-вторых, он выполняет итерацию по второму массиву и добавляет массивы, которые не были добавлены в первый проход (если ключ не был в первом массиве).

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

Это результат:

{"factor":["12","1","12","1"],"unit":["months","times","months","times"],"value":["2.5","2","2.5","2"],"planid":["1","1","1","1"],"position":["Test 1","Test 2","Test 3","Test 4"],"vouchervalue":["0","0","0","0"],"vouchertype":["","","",""],"vat":[19,19,19,19]} 

Если вы не хотите, чтобы цифры в формате JSON, чтобы быть строка кодируется, как «12», а 12, добавить JSON_NUMERIC_CHECK к json_encode

echo json_encode($b, JSON_NUMERIC_CHECK); 

{"factor":[12,1,12,1],"unit":["months","times","months","times"],"value":[2.5,2,2.5,2],"planid":[1,1,1,1],"position":["Test 1","Test 2","Test 3","Test 4"],"vouchervalue":[0,0,0,0],"vouchertype":["","","",""],"vat":[19,19,19,19]} 
0

вы ищете array_merge_recursive(). За Документов:

array_merge_recursive() объединяет элементы одного или более массивов таким образом, что значения одного присоединяются к концу предыдущего. Он возвращает результирующий массив.

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

Используя пример входы, которые @HasseBjork описано выше в своем ответе (основано на оригинальном входе):

$a = array( 
    array( 
     'factor'=> array('12', '1'), 
     'unit'=> array('months', 'times'), 
     'value'=> array('2.5', '2'), 
     'planid'=> array('1', '1'), 
     'position'=> array('Test 1', 'Test 2'), 
     'vouchervalue'=> array('0', '0'), 
     'vouchertype'=> array('', ''), 
     'vat'=> array(19, 19), 
    ), 
    array( 
     'factor'=> array('12', '1'), 
     'unit'=> array('months', 'times'), 
     'value'=> array('2.5', '2'), 
     'planid'=> array('1', '1'), 
     'position'=> array('Test 3', 'Test 4'), 
     'vouchervalue'=> array('0', '0'), 
     'vouchertype'=> array('', ''), 
     'vat'=> array(19, 19), 
    ), 
); 

Все, что вам нужно сделать, это:

echo json_encode(array_merge_recursive($a[0], $a[1]));