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

转换数组,使用父键php设置每个数组元素,php,arrays,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" } ] [ { "1": [ "tag_es1", "tag_es2", "tag_es3"

我接收的数据是一个元素数组,它包含一个标记数组,按如下语言排列

[
  {
    "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",
      "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\u 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",
      "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"
    }

  }
]
但我需要的是这样的回应

[
  {
    "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",
      "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\u combine
array\u walk
,并在
array\u map
中手动执行,但没有成功,我能做什么?

您可以循环数组并构建临时数组。
然后可以循环此数组并使用array_column on获取新数组的相应值

$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"
    }
  }
}


添加“1”、“2”作为键

解决方案,并使用
null
作为
array\u 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
    );
}

想解释一下吗?正如我所看到的,这完全符合op的预期。睡眠:)它们是“语言”键,我在另一个函数中使用它们来保存它们。更新了我的答案。
array\u combine(array\u keys($item),…
@u\u mulder你能提供一个链接或其他信息来精确说明“技巧”的作用吗?