通过匹配值从数组中获取值

时间:2019-08-17 22:56:33

标签: php arrays json

我想通过将值 classid instanceid 与另一个json打印匹配来从json打印获得值资产

让我说得更清楚。

我尝试了不同的方法,但是我不知道从哪里开始。它根本没有给我任何结果。

是这种情况。

这是第一个 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打印中获取资产id。

这是我的代码当前的样子,仅打印出 second json打印内容。

if(isset($inventories['descriptions'])) {
    foreach($inventories['descriptions'] as $key => $description) {
        //Testing                               
        $inv = $inventories['assets'][$description['classid'].'_'.$description['instanceid'];
    }
}

1 个答案:

答案 0 :(得分:0)

我理解您的问题如下:给定JSON对象列表(您称它们为打印件),您想根据其他具有一个JSON对象的对象,将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