首页 > 解决方案 > 通过匹配值从数组中获取值

问题描述

我想通过将值classidinstanceid与另一个 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'];
    }
}

标签: phparraysjson

解决方案


我对您的问题的理解如下:给定一个 JSON 对象列表(您称它们为 prints),您希望根据其他拥有一个对象并与and字段assetid匹配的对象为那些还没有这些对象的对象分配值。classidinstanceid

解决此问题的一种方法是:

  • 对您的 JSON 对象进行排序,以使具有assetid字段的对象排在第一位。当您检索数据(某些 API 查询?)或稍后使用例如usort()时,可能会发生这种情况
  • 初始化一个空数组,我们称之为assetids。这将在稍后将对classid_instanceid(字符串连接,如您的代码)映射到资产 ID。
  • 遍历 JSON 对象列表。对于这些对象中的每一个:
    • 如果它确实有一个assetid字段:将它与连接一起保存classidinstanceid作为键assetids
    • 如果它没有字段assetid:检查数组中和assetids的连接。 classidinstanceid
      • 如果存在,则您有匹配的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

推荐阅读