【问题标题】:array_merge does not work for 2 special json arraysarray_merge 不适用于 2 个特殊的 json 数组
【发布时间】:2020-08-25 05:13:28
【问题描述】:

有 2 个 json 数组需要合并,但是 array_merge 不起作用
我已经搜索并发现了可以与 array_merge 真正合并的 json 数组

这是我在单独文件中的 json 数据:

{
  "J": [
    {
      "a": "BAAB1",
      "b": "English"
    },
    {
      "a": "BAAB2",
      "b": "1"
    },
    {
      "a": "BAAB3",
      "b": "L"
    },
    {
      "a": "BAAB4",
      "b": "Test1 ..."
    },
    {
      "a": "BAAB5",
      "b": "Test2 ..."
    },
    {
      "a": "BAAB6",
      "b": "Test3 ..."
    }
  ]
}

还有:

{
  "J": [
    {
      "a": "BAAR1",
      "b": "T1"
    },
    {
      "a": "BAAR2",
      "b": "1"
    },
    {
      "a": "BAAR3",
      "b": "111111"
    },
    {
      "a": "BAAR4",
      "b": "3"
    },
    {
      "a": "BAAR5",
      "b": "3"
    },
    {
      "a": "BAAR6",
      "b": "222222"
    }
  ]
}

我从服务器上的路径读取文件,然后对每个读取的文件使用 json_decode,然后使用 array_merge
我认为我的 json 数组的名称 ("J") 造成了问题

这是我的代码:

//
$mLanguageFileName = $mClass_GeneralFunctions_General->GetStringBetween($mReadFile,"^^^","^^^^");
$mLanguageFile_Address = $ServerRoot_base.'/LAN/'.$mLanguageFileName.'.json';                
$mClass_GeneralFunctions_FileFunctions = new GeneralFunctions_FileFunctions();
$mJSONFile_Language_C = $mClass_GeneralFunctions_FileFunctions->ReadFile($mLanguageFile_Address);
      
//
$mThemeFileName_M0 = $mClass_GeneralFunctions_General->GetStringBetween($mReadFile,"^^^^","^^^^^");
$mThemeFile_M0_Address = $ServerRoot_base.'/M0T/'.$mThemeFileName_M0.'/'.$mThemeFileName_M0.'.json';  
$mClass_GeneralFunctions_FileFunctions = new GeneralFunctions_FileFunctions();
$mJSONFile_M0_C = $mClass_GeneralFunctions_FileFunctions->ReadFile($mThemeFile_M0_Address);          

//        

$mJsonArr_M0_C = json_decode($mJSONFile_M0_C, true);
$mJsonArr_Language_C = json_decode($mJSONFile_Language_C, true);

echo "\n\nmerge ... ";

$L = sizeof($mJsonArr_M0_C["J"]);
for ($i = 0; $i< $L; $i++)
{
    echo "\n\nmJsonArr_M0_C i = {$i} ";
    echo "\nmJsonArr_M0_C a = {$mJsonArr_M0_C["J"][$i]["a"]} ";
    echo "\nmJsonArr_M0_C b = {$mJsonArr_M0_C["J"][$i]["b"]} ";
    
}

$L = sizeof($mJsonArr_Language_C["J"]);
for ($i = 0; $i< $L; $i++)
{
    echo "\n\nmJsonArr_Language_C i = {$i} ";
    echo "\nmJsonArr_Language_C a = {$mJsonArr_Language_C["J"][$i]["a"]} ";
    echo "\nmJsonArr_Language_C b = {$mJsonArr_Language_C["J"][$i]["b"]} ";
    
}

$mJsonArr_C_LanguageM0 = array_merge($mJsonArr_Language_C, $mJsonArr_M0_C);         

for ($i = 0; $i< sizeof($mJsonArr_C_LanguageM0["J"]); $i++)
{
    echo "\n\nmJsonArr_C_LanguageM0 i = {$i} ";
    echo "\nmJsonArr_C_LanguageM0 a = {$mJsonArr_C_LanguageM0["J"][$i]["a"]} ";
    echo "\nmJsonArr_C_LanguageM0 b = {$mJsonArr_C_LanguageM0["J"][$i]["b"]} ";
    
}

每个 json 数组的数据都是真实回显的,但合并数据只是 array_merge 中的第二个 json 数组 ($mJsonArr_M0_C)

我该如何解决这个问题?

【问题讨论】:

  • 您的预期输出是什么?你看过array_merge_recursive吗?
  • 那么一个数组有 12 个对象?或者合并 6 个对象的键?具体一点。
  • 一个包含 12 个对象的数组

标签: php array-merge


【解决方案1】:

array_merge 应该是这样工作的:documentation 声明:

如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个。

这正是像“J”这样的键的情况:它是一个字符串键。

在您介绍的情况下,array_merge_recursive 完成了这项工作。例如:

$a = json_decode('{ "J": [{ "a": "BAAB1", "b": "English" }] }', true);
$b = json_decode('{ "J": [{ "a": "BAAR1", "b": "T1" }] }', true);
$merged = array_merge_recursive($a, $b);

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多