使用PHP从包含列表的JSON对象中获取具有max(value)的列表项的最佳方法

问题描述 投票:0回答:1

这看起来有点令人费解,但确实还不错。我有一个看起来像这样的JSON对象:

{'result': [{'label': {'field1': 'value1',
                       'field2': 'value2',
                       'field3': 'value3'},
             'names': {'field1': 'value4',
                       'field2': 'value5',
                       'field3': 'value6'},
             'score': {'field1': 0.9336825,
                       'field2': 0.9711186,
                       'field3': 0.7606185}},
            {'label': {'field1': 'value7',
                       'field2': 'value8',
                       'field3': 'value9'},
             'names': {'field1': 'value10',
                       'field2': 'value11',
                       'field3': 'value12'},
             'score': {'field1': 0.9336825,
                       'field2': 0.9711186,
                       'field3': 0.13707103}}]}

result是词典列表。每个这样的dictionary具有3个键,即labelnamescore。这些键中的每个键的值再次是具有3个字段的字典,为简单起见,可以说field1field2field3result中可以有任意数量的列表(尽管通常少于10个)。我想获取具有最大['score']['field3']值的列表(及其后续项目)。这些值的范围为0到1。遍历列表并跟踪max得分:

$resp=json_decode($response,TRUE);
        $max = -9.99;
        foreach ($resp['result'] as $item)
        {
                if ($item['score']['field3'] > $max)
                {
                        $max = $item['score']['field3'];
                        $product_code = $item['label']['field1'];
                        $product_name = $item['names']['field1'];
                        $product_score = $item['score']['field1'];
                        $topic_code = $item['label']['field2'];
                        $topic_name = $item['names']['field2'];
                        $topic_score = $item['score']['field2'];
                        $intent_code = $item['label']['field3'];
                        $intent_name = $item['names']['field3'];
                        $intent_score = $item['score']['field3'];
                }
        }

有更好的方法吗?

php json dictionary associative-array
1个回答
0
投票
IMO此处没有太多改进的空间,但是您可以这样节省一微秒:

$resp=json_decode($response,TRUE); $max = -9.99; $maxItem = []; foreach ($resp['result'] as $item) { if ($item['score']['field3'] > $max) { $max = $item['score']['field3']; $maxItem = $item; } } $product_code = $maxItem['label']['field1']; $product_name = $maxItem['names']['field1']; $product_score = $maxItem['score']['field1']; $topic_code = $maxItem['label']['field2']; $topic_name = $maxItem['names']['field2']; $topic_score = $maxItem['score']['field2']; $intent_code = $maxItem['label']['field3']; $intent_name = $maxItem['names']['field3']; $intent_score = $maxItem['score']['field3'];

两种方法中的任何一种,都无法遍历所有值,无法找到最大值。 
© www.soinside.com 2019 - 2024. All rights reserved.