我有粘贴波纹管的数据。我想根据名称进行组合,即abc名称模板使用不同的语言,我希望它在信息名称,类别及其所有语言中都位于同一索引上。
[{
"name": "abc",
"category": "new_cat",
"selectedLanguage": [{
"de": "Deutsch",
"de_status": "APPROVED"
}]
}, {
"name": "abc",
"category": "new_cat",
"selectedLanguage": [{
"en": "English",
"en_status": "APPROVED"
}]
}, ....
如上所述,我希望将结果作为json粘贴在下面。
[{
"name": "abc",
"category": "new_cat",
"selectedLanguage": [{
"de": "Deutsch",
"de_status": "APPROVED"
}, {
"en": "English",
"en_status": "APPROVED"
}]
},...{
"name": "unique_temp",
"category": "TICKET_UPDATE",
"selectedLanguage": [{
"en": "English",
"en_status": "REJECTED"
}, {
"fr": "French",
"fr_status": "REJECTED"
}]
}]
我为此写了一个代码
$trimArr; //this data array
$finalTempArr = array();
$finalArr = array();
foreach ($trimArr as $tr) {
$checkIfExist = $this ->in_array_r($wr['name'], $finalArr);
if($checkIfExist == false){
$finalTempArr['name'] = $tr['name'];
$finalTempArr['category'] = $tr['category'];
$finalTempArr['selectedLanguage'] = $tr['selectedLanguage'];
}else {
array_push($finalTempArr['selectedLanguage'],$tr['selectedLanguage']);
}
array_push($finalArr, $finalTempArr);
}
echo json_encode($finalArr);
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item)
&& $this->in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
答案 0 :(得分:0)
您可以使用array_reduce
来完成它:
$result = array_reduce($array, static function(array $carry, array $item) {
$key = $item['name'] . $item['category'];
if (isset($carry[$key])) {
$carry[$key]['selectedLanguage'] = array_merge($carry[$key]['selectedLanguage'], $item['selectedLanguage']);
} else {
$carry[$key] = $item;
}
return $carry;
}, []);
如果在精简后需要重新输入键,则可以在结果上使用array_values
:
$result = array_values($result);
答案 1 :(得分:0)
一个简单的foreach循环即可。
我想在名字的基础上合并
因此,在分组和合并数据时,只需使用name
作为临时密钥即可。
代码:(Demo)
$result = [];
foreach (json_decode($json, true) as $row) {
if (!isset($result[$row['name']])) {
$result[$row['name']] = $row;
} else {
$result[$row['name']]['selectedLanguage'] = array_merge($result[$row['name']]['selectedLanguage'], $row['selectedLanguage']);
}
}
var_export(array_values($result));
我考虑得越多,您的子数组结构可能不适合目标。如果最终要搜索可用的语言以返回语言状态,则将数组结构设置为“查找”会更好。换句话说,每个selectedLanguage
子数组应为平面关联数组,并以language
作为键,并将language_status
作为值。看起来像"en" => "APPROVED"
。
或者,如果您的脚本已经在依靠en
键来查找适当的值,则保留en
作为键,并从en
创建一个平坦的关联子数组。我不能真正说出100%的信心应该做什么,但是我可以肯定地说,您的数据结构可以得到改善。放弃索引的子数组结构后,便可以实现a recursive merge/replace technique.