1 回答
TA贡献1853条经验 获得超6个赞
我对您的问题的理解如下:给定一个 JSON 对象列表(您称它们为打印),您想assetid
根据其他拥有一个并匹配classid
和instanceid
字段的对象,将值分配给那些还没有的对象。
解决此问题的一种方法是:
对 JSON 对象进行排序,使具有
assetid
字段的对象排在最前面。当您检索数据(某些 API 查询?)或稍后使用例如usort()时,可能会发生这种情况初始化一个空数组,我们称之为
assetids
。这将在稍后将classid_instanceid
配对(字符串连接,如您的代码)映射到资产 ID。遍历 JSON 对象列表。对于这些对象中的每一个:
如果存在,则您拥有匹配的
assetid
.如果不是,
assetid
则不存在匹配。如果它确实有一个
assetid
字段:将它与classid
和instanceid
作为键的串联保存在一起assetids
如果它不是有一个
assetid
字段:检查assetids
为串联阵列classid
和instanceid
。
PHP 实现可能如下所示(为简单起见,我使用数组而不是 JSON 对象):
// Some example data
$data = Array(
Array (
"name" => "a",
"assetid" => 100,
"classid" => 1,
"instanceid" => 1,
),
Array (
"name" => "b",
"classid" => 2,
"instanceid" => 1,
),
Array (
"name" => "c",
"classid" => 1,
"instanceid" => 1,
),
Array (
"name" => "d",
"classid" => 3,
"instanceid" => 1,
),
Array (
"name" => "e",
"assetid" => 200,
"classid" => 2,
"instanceid" => 1,
)
);
// Make sure entries with "assetid" field come first
// See https://stackoverflow.com/a/5897975/8528014
usort($data, function ($a, $b)
{
return isset($b['assetid']) - isset($a['assetid']);
});
// Determine assetids
$assetids = Array();
foreach($data as $obj)
{
if(isset($obj['assetid']))
{
$key = $obj['classid'].'_'.$obj['instanceid'];
$assetid = $obj['assetid'];
$assetids[$key] = $assetid;
echo "Object ".$obj['name']." has assetid $assetid\n";
}
else
{
$key = $obj['classid'].'_'.$obj['instanceid'];
if(!isset($assetids[$key]))
echo "Could not find assetid for object ".$obj['name']."\n";
else
{
$assetid = $assetids[$key];
echo "Object ".$obj['name']." has assetid $assetid\n";
}
}
}
输出是:
Object a has assetid 100
Object e has assetid 200
Object b has assetid 200
Object c has assetid 100
Could not find assetid for object d
- 1 回答
- 0 关注
- 213 浏览
添加回答
举报