2015-12-02 18 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]}" 

的想法每个订单都可以包含多于1个可用于创建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','unit')在这两个数组中都可用,则会合并它们,否则它只会添加数组。

其次,它遍历第二个数组并添加第一遍中未添加的数组(如果该键不在第一个数组中)。

在你的情况下,数组似乎有相同的一组按键,以及第二遍可能不是必要的,但只是要确定...

这是结果:

{"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]));