提问者:小点点

在json_decode之后,获取键值的数组搜索不起作用


我有以下JSON代码:

[
{"id":16385,"value":"2"},
{"id":4121,"value":"Spiderman"},
{"id":78036,"value":"Batman"},
{"id":8075,"value":["I accept the terms"]}
]

下面的数组不使用JSON_Decode:

Array ( 
[0] => stdClass Object ( [id] => 16385 [value] => 2 ) 
[1] => stdClass Object ( [id] => 4121 [value] => Spiderman ) 
[2] => stdClass Object ( [id] => 78036 [value] => Batman ) 
[3] => stdClass Object ( [id] => 8075 [value] => Array ( [0] => I accept the terms ) ) 
)

我想使用array_searchhttps://www.php.net/manual/en/function.array-search.php

所以我写了这个:

$key = array_search('4121', $array);

我希望$key1,但如果我执行echo$key,则为空

下面是我的完整代码:

function personen_tonen() { 
    ob_start();
    global $wpdb;

    //SQL query
    $sql = "SELECT JSON_EXTRACT(custom_fields, '$') AS 'Test' FROM `wp_bookly_customer_appointments`";

    $personen = $wpdb->get_results($sql);   

    foreach($personen as $persoon) {

        $array = $persoon->Test;
        $data = json_decode($array);

        print_r($data);

       $key = array_search('4121', $data);
       echo $key;

    }

    return ob_get_clean();
}
add_shortcode('personen', 'personen_tonen');

共2个答案

匿名用户

如果。。。想要使用array_search()函数,则需要使用json_decode()true作为第二个参数来解码JSON字符串并将JSON内容转换为关联数组:

<?php
$json = '[
   {"id":16385,"value":"2"},
   {"id":4121,"value":"Spiderman"},
   {"id":78036,"value":"Batman"},
   {"id":8075,"value":["I accept the terms"]}
]';

$array = json_decode($json, true);
$key = array_search('4121', array_column($array, 'id'));
$value = array_column($array, 'value');
var_dump($key);
var_dump(array_column($array, 'value')[$key]);
?>

匿名用户

您应该使用array_column获取所有ID,否则array_search将尝试查找对象“4121”,这不是您想要的。 否则您可以编写自己的算法:

$item = null;
foreach($array as $obj) {
    if ($obj->id == '4121') {
        $item = $obj;
        break;
    }
}

如果效率对您来说不是一个问题,而且您不会处理大的数据集,那么使用PHP的算法,否则考虑使用这个算法(使用array_column您有一个O(2*n)的复杂性,而使用这个解决方案O(n),因此它最多会快2倍)