PHP-合并追加多个json数组

我需要合并/加入包含数组的多个json字符串(也需要合并),但是我不知道实现此目的的最佳方法是什么:

json字符串的初始数组(在下面的示例中称为$ rrDatas):

Array
(
    [0] => {"asset":[1],"person":[1]}
    [1] => {"asset":[2]}
)

预期结果:

{"asset":[1,2],"person":[1]}

主要的困难是数组的数量是不确定的(我的例子是用2个数组制作的,但可能是3,4等)。第二个困难是可以有多个属性(例如“资产”,“人”等,但是总是数组)。这些可能的属性是已知的,但有许多属性,因此,如果算法是动态的,则更好。

此刻我能做什么:

$mergedAssets['asset'] = [];
foreach ($rrDatas as $rrData)
{
     $rrDataJson = \GuzzleHttp\json_decode($rrData,true);
     $mergedAssets['asset'] = array_merge($mergedAssets['asset'],$rrDataJson['asset']);
}
$result = \GuzzleHttp\json_encode($mergedAssets,true);

结果:

{"asset":[1,2]}

这很好用,但不是动态的,我应该为每个可能的属性(例如“人”等)复制此部分吗?

谢谢, 纪尧姆

编辑:下面布雷特·格雷格森(Brett Gregson)和krylov123的回答帮助我建立了自己的解决方案,该解决方案是两种建议的结合:

$mergedJson = [];
foreach ($rrDatas as $rrData)
{
     $rrDataJson = \GuzzleHttp\json_decode($rrData,true);
     foreach(array_keys($rrDataJson) as $property)
     {
          $mergedJson[$property] = array_merge($mergedJson[$property] ?? [],$rrDataJson[$property]);
     }
}
return \GuzzleHttp\json_encode($mergedJson,true);

在下面找到一个更好的示例:

$rrDatas = Array ( 
     [0] => {"asset":[1,"person":[1],"passive":[1]} 
     [1] => {"asset":[3],"charge":[1],"passive":[2]} 
) 

必须产生的结果:

{"asset":[1,2,3],"passive":[1,"charge":[1]}

编辑2:我刚刚尝试过Progrock的解决方案,它似乎也可以很好地工作:https://3v4l.org/7hSqi

alanpiter 回答:PHP-合并追加多个json数组

您可以使用类似的内容:

$output = []; // Prepare empty output

foreach($rrDatas as $inner){
  foreach($inner as $key => $value){
    $output[$key][] = $value;
  }
}

echo json_encode($output); // {"asset":[1,2],"person":[1]}

应该给您想要的输出。无论单个数组中的键如何,甚至对于空数组,这都应该起作用。

Working example here

Another example具有更多的数组,更多的键和空数组

,

您需要使用foreach ($array as $key => $value)迭代,才能动态使用json数组的键(例如“ asset”和“ person”)。

解决方案:

$mergedAssets['asset'] = [];
foreach ($rrDatas as $key => $value)
{
    $rrDataJson = \GuzzleHttp\json_decode($value,true);
    $mergedAssets[$key] = array_merge($mergedAssets[$key],$rrDataJson[$key]);
}
$result = \GuzzleHttp\json_encode($mergedAssets,true);
,
(mne) C:\Users\Montu\Desktop\RESEARCH\codes>python convert_signal_to_images.py
  Traceback (most recent call last):
    File "convert_signal_to_images.py",line 3,in <module>
      from pyts.image import GramianAngularField
    File "C:\Users\Montu\Anaconda3\envs\mne\lib\site-packages\pyts\image\__init__.py",line 6,in <module>
      from .gaf import GramianAngularField
    File "C:\Users\Montu\Anaconda3\envs\mne\lib\site-packages\pyts\image\gaf.py",line 11,in <module>
      from ..approximation import PiecewiseAggregateApproximation
    File "C:\Users\Montu\Anaconda3\envs\mne\lib\site-packages\pyts\approximation\__init__.py",line 4,in <module>
      from .sax import SymbolicAggregateApproximation
    File "C:\Users\Montu\Anaconda3\envs\mne\lib\site-packages\pyts\approximation\sax.py",line 9,in <module>
      from ..preprocessing import KBinsDiscretizer
    File "C:\Users\Montu\Anaconda3\envs\mne\lib\site-packages\pyts\preprocessing\__init__.py",in <module>
      from .transformer import PowerTransformer,QuantileTransformer
    File "C:\Users\Montu\Anaconda3\envs\mne\lib\site-packages\pyts\preprocessing\transformer.py",line 7,in <module>
      from sklearn.preprocessing import PowerTransformer as SklearnPowerTransformer
  ImportError: cannot import name 'PowerTransformer'

输出:

<?php    
$array =
[
    '{"asset":[1],"person":[1]}','{"asset":[2]}',];    

$array  = array_map(function($v) { return json_decode($v,true);},$array);
$merged = array_merge_recursive(...$array);
print json_encode($merged);
本文链接:https://www.f2er.com/3165292.html

大家都在问