给定对象列表,PHP通过键查找值

时间:2019-07-29 15:03:51

标签: php json

我将这个JSON数据设置为如下所示的对象数组,其中键的字面意思是“ key”,值的字面意思是“ value”:

$fruit = [{"key": "a", "value": "apple"}, 
          {"key": "b", "value": "banana"},
          {"key": "c", "value": "cherry"}];

我正在尝试编写一个PHP函数,该函数将这个数组作为参数以及要查找的键。

该函数应充当查找,以便该函数将返回与提供的键关联的值。例如:

function lookup($array, $key){

   // look through the list of objects and 
   // return value that is associated with this key 
}

函数调用示例:

lookup($fruit, "c");

预期输出:

"cherry"

我是PHP的新手,所以我不知道PHP是否具有可以简化此工作的最佳实践或本机功能,还是我应该遍历$ fruit数组并首先使用它构建新的PHP数组?最好的方法是什么?

3 个答案:

答案 0 :(得分:3)

使用PHP 7.0+,您可以在对象数组上使用array_column

提供第二个参数作为从中检索值的属性名称,然后使用第三个参数指定要作为索引依据的属性名称,将为您提供由指定键索引的值的完整列表。

示例https://3v4l.org/vJcmH

$values = array_column($json, 'value', 'key');

var_dump($values);
/*
 array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}
*/

var_dump($values['c']);
/*
  string(6) "cherry"
 */

功能用法https://3v4l.org/8TMBf

/**
 * @param array|object[] $json
 * @param string $key
 * @param mixed $default
 * @param string $column
 * @param string $index
 * @return string
 */
function lookup($json, $key, $default = '', $column = 'value', $index = 'key') {
    return array_column($json, $column, $index)[$key] ?? $default;
}

var_dump(lookup($json, 'c'));

结果:

string(6) "cherry"
  

请注意,如果您希望有一个值,它将返回一个值   具有相同key属性值的1个以上的结果,这种方法   不会产生预期的结果。如果是这样,请告诉我,我将更新我的答案。

答案 1 :(得分:1)

将JSON字符串转换为PHP数组

$fruit = json_decode($fruit, true);
lookup($fruit, 'key');

然后,您只需要遍历函数中的数组即可。

function lookup($array, $key) {

    //loop through all values in array
    foreach($array as $values) {

        //if 'key' value matches `$key`, return 'value' value.
        if($values['key'] == $key) {
            return $values['value'];
        }

    }

    //if nothing has been returned, return empty string
    return "";
}

现在,如果您可以控制创建$fruit值,则最好采用以下模式创建它:

$fruit = [
    "a" => "apple",
    "b" => "banana",
    "c" => "cherry",
];

然后您可以使用:

$fruit[$key];

答案 2 :(得分:0)

类似的事情会起作用。

https://ideone.com/94Uxby

<?php

$fruit = json_decode($sourceOfJson, true);

function lookup($array, $key){
    // Find the index of the entry where "key" = $key
    $index = array_search($key, array_column($array, 'key'));

    // Handle the entry not being found however you want to.
    if(!$index){
        return null;
        // throw new Exception("Couldn't find index from value $key");
        // Log::error("Couldn't find index from value $key");
        // return 'SomeDefaultValue';
    }

    return $array[$index]['value'];
}

echo lookup($fruit, 'c');