基于相同键但不同键值的数组合并应添加为单独的数组

时间:2020-06-17 07:29:06

标签: php arrays logic

我有粘贴波纹管的数据。我想根据名称进行组合,即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;
}

2 个答案:

答案 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.

相关问题