Массив выглядит так:
[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]
по своему усмотрению.