Intereting Posts
Автоматически включать недостающие функции? php получает переменные в качестве ключа без присвоенного значения Строковая переменная для выполнения PHP-кода Значения массива сумм одного и того же ключа Производительность в PDO / PHP / MySQL: транзакция против прямого выполнения Как написать выражение регулярного выражения, которое заменяет значение привязки и ссылок mysqli фатальная ошибка: индекс не используется в запросе / подготовленном сообщении Можем ли мы иметь язык, отличный от английского, в URL? Помощь синтаксического анализа XML с помощью DOMDocument Вызов python из php завершается с ошибкой при импорте numpy Установите GD-библиотеку и freetype в Linux PHP Include () – Верхний и нижний колонтитулы Проблема с функцией удаления акцентов и других символов в PHP PHP: scandir () слишком медленный Лучший способ проверить, вернулись ли результаты MySQL в PHP?

PHP – поиск элемента по объекту из массива объектов

Массив выглядит так:

[0] => stdClass Object ( [ID] => 420 [name] => Mary ) [1] => stdClass Object ( [ID] => 10957 [name] => Blah ) ... 

И у меня есть целочисленная переменная с именем $v .

Как я могу выбрать запись массива, в которой есть объект, где свойство ID имеет значение $v ?

Вы либо итерации массива, ищите конкретную запись (нормально в одно время только поиск), либо создайте хэш-карту, используя другой ассоциативный массив.

Для первого, что-то вроде этого

 $item = null; foreach($array as $struct) { if ($v == $struct->ID) { $item = $struct; break; } } 

См. Этот вопрос и последующие ответы для получения дополнительной информации о последнем – Reference PHP array несколькими индексами

ЮркамТим прав. Он нуждается только в модификации: (Извините, я не могу комментировать сейчас).

После функции ($) вам нужен указатель на внешнюю переменную с помощью «use (& $ searchValue)», а затем вы можете получить доступ к внешней переменной. Также вы можете изменить его.

 $neededObject = array_filter( $arrayOfObjects, function ($e) use (&$searchedValue) { return $e->id == $searchedValue; } ); 

Здесь я нашел более элегантное решение. Адаптированный к вопросу, он может выглядеть так:

 $neededObject = array_filter( $arrayOfObjects, function ($e) { return $e->id == $searchedValue; } ); 
 class ArrayUtils { public static function objArraySearch($array, $index, $value) { foreach($array as $arrayInf) { if($arrayInf->{$index} == $value) { return $arrayInf; } } return null; } } 

Используя то, что вы хотели, было бы что-то вроде:

 ArrayUtils::objArraySearch($array,'ID',$v); 

Мне иногда нравится использовать функцию array_reduce () для выполнения поиска. Это похоже на array_filter (), но не влияет на искомый массив, позволяя выполнять несколько поисков в одном массиве объектов.

 $haystack = array($obj1, $obj2, ...); //some array of objects $needle = 'looking for me?'; //the value of the object's property we want to find //carry out the search $search_results_array = array_reduce( $haystack, function($result_array, $current_item) use ($needle){ //Found the an object that meets criteria? Add it to the the result array if ($current_item->someProperty == $needle){ $result_array[] = $current_item; } return $result_array; }, array() //initially the array is empty (ie: item not found) ); //report whether objects found if (count($search_results_array) > 0){ echo "found object(s): "; print_r($search_results_array[0]); //sample object found } else { echo "did not find object(s): "; } 

Исправляя небольшую ошибку @YurkaTim , ваше решение работает для меня, но добавляет use :

Чтобы использовать $searchedValue , внутри функции можно use ($searchedValue) одно решение use ($searchedValue) после функции параметров function ($e) HERE .

функция array_filter возвращает только на $neededObject если условие return равно true

Если $searchedValue является строкой или целым числом:

 $searchedValue = 123456; // Value to search. $neededObject = array_filter( $arrayOfObjects, function ($e) use ($searchedValue) { return $e->id == $searchedValue; } ); var_dump($searchedValue); // To see the output 

Если $searchedValue – это массив, где нам нужна проверка со списком:

 $searchedValue = array( 1, 5 ); // Value to search. $neededObject = array_filter( $arrayOfObjects, function ( $e ) use ( $searchedValue ) { return in_array( $e->term_id, $searchedValue ); } ); var_dump($searchedValue); // To see the output 

Я сделал это с помощью какой-либо Java-карты. Если вы это сделаете, вам не нужно циклически перебирать массив объектов каждый раз.

 <?php //This is your array with objects $object1 = (object) array('id'=>123,'name'=>'Henk','age'=>65); $object2 = (object) array('id'=>273,'name'=>'Koos','age'=>25); $object3 = (object) array('id'=>685,'name'=>'Bram','age'=>75); $firstArray = Array($object1,$object2); var_dump($firstArray); //create a new array $secondArray = Array(); //loop over all objects foreach($firstArray as $value){ //fill second key value $secondArray[$value->id] = $value->name; } var_dump($secondArray); echo $secondArray['123']; 

вывод:

 array (size=2) 0 => object(stdClass)[1] public 'id' => int 123 public 'name' => string 'Henk' (length=4) public 'age' => int 65 1 => object(stdClass)[2] public 'id' => int 273 public 'name' => string 'Koos' (length=4) public 'age' => int 25 array (size=2) 123 => string 'Henk' (length=4) 273 => string 'Koos' (length=4) Henk 
 $arr = [ [ 'ID' => 1 ] ]; echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false) 

Использование array_column для переиндексации позволит сэкономить время, если вам нужно найти несколько раз:

 $lookup = array_column($arr, NULL, 'id'); // re-index by 'id' 

Тогда вы можете просто $lookup[$id] по своему усмотрению.