PHP-найти запись по свойству объекта из массива объектов
массив выглядит так:
[0] => stdClass Object
(
[ID] => 420
[name] => Mary
)
[1] => stdClass Object
(
[ID] => 10957
[name] => Blah
)
...
и у меня есть целочисленная переменная с именем $v.
как я могу выбрать запись массива, которая имеет объект, где свойство ' ID ' имеет $v значение ?
9 ответов:
вы либо повторяете массив, ища конкретную запись (ok в однократном поиске), либо строите хэш-карту, используя другой ассоциативный массив.
для первого, что-то вроде этого
$item = null; foreach($array as $struct) { if ($v == $struct->ID) { $item = $struct; break; } }посмотреть этот вопрос и последующие ответы для получения дополнительной информации о последней - ссылка PHP массив по нескольким индексам
YurkamTim - Это верно. Он нуждается только в модификации: (Извините, я не могу комментировать сейчас).
после функции ($) вам нужен указатель на внешнюю переменную с помощью "use(&$searchedValue)", а затем вы можете получить доступ к внешней переменной. Также вы можете изменить его.
$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_column для повторного индексирования сэкономит время, если вам нужно найти несколько раз:
$lookup = array_column($arr, NULL, 'id'); // re-index by 'id'затем вы можете просто
$lookup[$id]по желанию.
Мне иногда нравится использовать 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 (i.e.: 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)после параметров функцииfunction ($e) HERE.the
array_filterфункция только вернуться на$neededObjectесли условие при возврате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
Comments