#php #arrays #search
#php #массивы #Поиск
Вопрос:
У меня есть массив, созданный из json_decode, который выглядит как показано ниже, создавая массив объектов. У меня есть 2 вопроса, один из которых — функциональность, не работающая должным образом, и 2, вопрос, связанный с производительностью. Это то, что у меня есть:
{
"info": {
"options": [{
"optionID": 123
},
{
"optionID": 456
},
{
"optionID": 789
}
]
}
}
К сожалению json_decode
, это делается в другом месте и при изменении приведет к поломке большого количества другого кода, так что это не вариант для перехода true
к json_decode.
$data = file_get_contents('/datastore.json');
$options = json_decode($data);
var_dump($idpassed);
var_dump($options);
Приведенное выше приводит:
int(123)
array(3) {
[0]=>
object(stdClass)#551 (16) {
["optionID"]=> (int)123
},
[1]=>
object(stdClass)607 (16) {
["optionID"]=> (int)456
},
[2]=>
object(stdClass)#663 (16) {
["optionID"]=> (int)789
}
}
Я пытаюсь найти, существует ли свойство ‘optionID’, в зависимости от значения, установленного в другом месте. Поэтому я делаю это:
if (array_search($idpassed, array_column($options, 'optionID')) !== FALSE) {
echo "the option exists!";
} else {
echo "the option does not exist!";
}
Вопрос 1:
Если $idpassed
есть 456
или 789
, это всегда возвращает true, именно так, как я ожидаю. Однако, если я передам 123
, это завершится неудачей, предположительно потому options
0
, что массив индекса является ложным. Какие еще варианты у меня есть !== FALSE
для этого метода? Все, что я пробовал (например, === false или === true, не работает из 0
-за возвращаемого ключа.
В качестве альтернативного подхода я просто выполнил простой foreach, который работает так, как ожидалось:
$exists = false;
foreach ($options as $option) {
if ($option->optionID === $idpassed) {
$exists = true;
break;
}
}
print_r($exists)
Этот метод возвращает true для 123
456
и 789
и false для всего, чего я не ожидаю.
Вопрос 2:
Итак, какой метод лучше для производительности и почему? Я считаю, что метод array_column должен быть быстрее, потому что это прямая реализация C, но не уверен на 100%.
Большое спасибо!
Комментарии:
1. возможно,
123
это не то, что вы думаете, учитывая то, что дает ваш ввод выше, блок кода, который у вас уже есть, работает так, как ожидалось. 3v4l.org/a30mV2. Я сделал var_dump обоих
$idpassed
,$option->optionID
и оба они естьinteger 123
.3. Ваша проблема не воспроизводима с информацией, которой мы располагаем до сих пор, 3v4l.org/YUGOl показывает, что это работает нормально и так, как ожидалось.
4. Хорошо, я думаю, что, возможно, я нашел проблему. json_decode($options, true) — значение true не задано, поэтому у меня есть массив объектов. Итак, вопрос в том, как это сделать с массивом объектов?