转换数组,使用父键php设置每个数组元素

时间:2018-09-12 19:17:33

标签: php arrays

我正在接收的数据是元素数组,其中包含像这样的语言所组成的标签数组

[
  {
    "1": "tag_es1;tag_es2;tag_es3",
    "2": "tag_en1;tag_en2;tag_en3"
  },
  {
    "1": "tag_es1;tag_es2",
    "2": "tag_en1;tag_en2"
  }
]

我需要按语言将每个tag分开,所以我使用array_map来进行这样的转换

[
  {
    "1": [
      "tag_es1",
      "tag_es2",
      "tag_es3"
    ],
    "2": [
      "tag_en1",
      "tag_en2",
      "tag_en3"
    ]
  },
  {
    "1": [
      "tag_es1",
      "tag_es2"
    ],
    "2": [
      "tag_en1",
      "tag_en2"
    ]
  }
]

我需要的是这样的回应

[
  {
    {
      "1" : "tag_es1",
      "2" : "tag_en1"
    },
    {
      "1" : "tag_es2",
      "2" : "tag_en2"
    },
    {
      "1" : "tag_es3",
      "2" : "tag_en3"
    }
  },
  {
    {
      "1" : "tag_es4",
      "2" : "tag_en4"
    },
    {
      "1" : "tag_es5",
      "2" : "tag_en5"
    }

  }
]

我尝试使用array_combinearray_walk,并在array_map内手动进行操作,但是没有成功,我该怎么办?

2 个答案:

答案 0 :(得分:1)

具有特殊技巧的解决方案,其中null作为array_map的回调:

$arr = json_decode($s, true);
$new_arr = [];

foreach ($arr as $item) {
    $parts1 = explode(';', $item[1]);
    $parts2 = explode(';', $item[2]);

    // $new_arr[] = array_map(null, $parts1, $parts2);

    $tmp_arr = array_map(null, $parts1, $parts2);
    $new_arr[] = array_map(
        function($v) { return array_combine(["1","2"], $v); }, 
        $tmp_arr
    );
}

答案 1 :(得分:0)

您可以循环数组并构建一个临时数组。
然后可以循环使用此数组,并使用array_column来将相应的值获取到新数组。

$arr = json_decode($json, true);
foreach($arr as $key1 => $sub){
    foreach($sub as $item){
        $temp[] = explode(";", $item);
    }
    foreach($temp[0] as $key2 => $val){
        $new[$key1][]= array_combine([1,2],array_column($temp, $key2));
    }
    $temp =[]; // empty array
}
var_dump($new);

输出:

array(2) {
  [0]=>
  array(3) {
    [0]=>
    array(2) {
      [1]=>
      string(7) "tag_es1"
      [2]=>
      string(7) "tag_en1"
    }
    [1]=>
    array(2) {
      [1]=>
      string(7) "tag_es2"
      [2]=>
      string(7) "tag_en2"
    }
    [2]=>
    array(2) {
      [1]=>
      string(7) "tag_es3"
      [2]=>
      string(7) "tag_en3"
    }
  }
  [1]=>
  array(2) {
    [0]=>
    array(2) {
      [1]=>
      string(7) "tag_es1"
      [2]=>
      string(7) "tag_en1"
    }
    [1]=>
    array(2) {
      [1]=>
      string(7) "tag_es2"
      [2]=>
      string(7) "tag_en2"
    }
  }
}

https://3v4l.org/qgCA1

添加了“ 1”,“ 2”作为键