为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
aluckdog 2021-11-26 17:57:21
我想通过将值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 打印中获取资产 ID。这就是我的代码目前的样子,它只打印出第二个json 打印。if(isset($inventories['descriptions'])) {    foreach($inventories['descriptions'] as $key => $description) {        //Testing                                       $inv = $inventories['assets'][$description['classid'].'_'.$description['instanceid'];    }}
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

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

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

  • 对 JSON 对象进行排序,使具有assetid字段的对象排在最前面。当您检索数据(某些 API 查询?)或稍后使用例如usort()时,可能会发生这种情况

  • 初始化一个空数组,我们称之为assetids。这将在稍后将classid_instanceid配对(字符串连接,如您的代码)映射到资产 ID。

  • 遍历 JSON 对象列表。对于这些对象中的每一个:

    • 如果存在,则您拥有匹配的assetid.

    • 如果不是,assetid则不存在匹配。

    • 如果它确实有一个assetid字段:将它与classidinstanceid作为键的串联保存在一起assetids

    • 如果它不是有一个assetid字段:检查assetids为串联阵列classidinstanceid

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


查看完整回答
反对 回复 2021-11-26
  • 1 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信