Поиск по массиву для получения значения ключа не работает после json_decode - PullRequest
2 голосов
/ 17 июня 2020

У меня есть этот JSON код:

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

У меня есть array ниже, без использования 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_search https://www.php.net/manual/en/function.array-search.php

Итак, я написал это:

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

Я ожидал, что $key будет 1, но он пуст, если я это сделаю 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 ]

0 голосов
/ 17 июня 2020

Вы должны использовать array_column для получения всех идентификаторов, иначе 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 раза быстрее)

0 голосов
/ 17 июня 2020

Если вы ... хотите использовать функцию 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]);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...