PHP:以特定方式从数组生成JSON


PHP: Generate JSON from array in a specific way

我想以特定的方式从Array创建一个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可以在应用程序的其余部分中使用(有一个表使用JSON)。

好吧,我不知道如何解决这个问题,所以我对任何提示都很满意:-)

假设您拥有数组$a中的数据。

$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 );

这将遍历第一个数组。如果键("actor"、"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]}

您正在寻找array_merge_recursive()。根据文件:

array_marge_recurive()将一个或多个数组的元素合并在一起,以便将其中一个的值附加到前一个的末尾。它返回生成的数组。

如果输入数组具有相同的字符串键,那么这些键的值将合并到一个数组中,并且这是递归完成的,因此,如果其中一个值本身是数组,函数也会将其与另一个数组的相应条目合并。但是,如果数组具有相同的数字键,则后面的值不会覆盖原始值,而是被追加。

使用@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]));