Поиск по массиву со столбцом массива не работает в массиве

#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/a30mV

2. Я сделал var_dump обоих $idpassed , $option->optionID и оба они есть integer 123 .

3. Ваша проблема не воспроизводима с информацией, которой мы располагаем до сих пор, 3v4l.org/YUGOl показывает, что это работает нормально и так, как ожидалось.

4. Хорошо, я думаю, что, возможно, я нашел проблему. json_decode($options, true) — значение true не задано, поэтому у меня есть массив объектов. Итак, вопрос в том, как это сделать с массивом объектов?