php - 通过匹配值从数组中获取值
问题描述
我想通过将值classid和instanceid与另一个 json 打印匹配来从 json 打印中获取值assetid 。
让我说得更清楚。
我尝试了不同的东西,但我只是不知道从哪里开始。它根本没有给我任何结果。
情况就是这样。
这是第一个json 打印。
[22] => Array (
[appid] => 730
[contextid] => 2
[assetid] => 15722336716
[classid] => 310776570
[instanceid] => 302028390
[amount] => 1
)
如您所见,它包含一个我需要获取的名为assetid的值。
这是第二个json 打印。
[6] => Array (
[appid] => 730
[classid] => 310776570
[instanceid] => 302028390
[currency] => 0
)
classid 和 instanceid 是匹配的,但是我需要通过匹配第二个 json 打印中的 classid 和 instanceid 从第一个 json 打印中获取assetid。
这就是我的代码目前的样子,它只打印出第二个json 打印。
if(isset($inventories['descriptions'])) {
foreach($inventories['descriptions'] as $key => $description) {
//Testing
$inv = $inventories['assets'][$description['classid'].'_'.$description['instanceid'];
}
}
解决方案
我对您的问题的理解如下:给定一个 JSON 对象列表(您称它们为 prints),您希望根据其他拥有一个对象并与and字段assetid
匹配的对象为那些还没有这些对象的对象分配值。classid
instanceid
解决此问题的一种方法是:
- 对您的 JSON 对象进行排序,以使具有
assetid
字段的对象排在第一位。当您检索数据(某些 API 查询?)或稍后使用例如usort()时,可能会发生这种情况 - 初始化一个空数组,我们称之为
assetids
。这将在稍后将对classid_instanceid
(字符串连接,如您的代码)映射到资产 ID。 - 遍历 JSON 对象列表。对于这些对象中的每一个:
- 如果它确实有一个
assetid
字段:将它与连接一起保存classid
并instanceid
作为键assetids
- 如果它没有字段
assetid
:检查数组中和assetids
的连接。classid
instanceid
- 如果存在,则您有匹配的
assetid
. assetid
如果不是,则不存在匹配项。
- 如果存在,则您有匹配的
- 如果它确实有一个
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
推荐阅读
- c# - 执行从 C# 到 EuroTruck 的密钥输出不起作用(PostMessage、user32.dll)
- statistics - 为什么 Grafana 不向我显示正确的计数?
- oracle - PL/SQL代码出错,无法理解代码中的错误和错误
- c# - C#中字符串解析的正则表达式
- java - 添加第二条记录时休眠 OneToMany 错误
- python - 如何复制工作簿末尾而不是开头的工作表?
- ios - 我应该如何在 RxSwift Singles 中正确使用保护语句?
- http - Delphi ServerSocket 对客户端的响应
- php - 如何输出 WordPress 小部件以使标题显示在内容下方而不是上方?
- python - 在文件名 (yyyy/mm/dd) 中查找日期/财务季度,然后将文件名中的日期更改为 yyyy/mm/dd + 3 个月