PHP - найти запись по свойству объекта из массива объектов
Массив выглядит так:
[0] => stdClass Object
(
[ID] => 420
[name] => Mary
)
[1] => stdClass Object
(
[ID] => 10957
[name] => Blah
)
...
И у меня есть целочисленная переменная с именем $v
,
Как я могу выбрать запись массива, который имеет объект, где свойство 'ID' имеет $v
значение?
14 ответов
Вы или итерируете массив, ища определенную запись (хорошо, только для одноразового поиска) или создаете хэш-карту, используя другой ассоциативный массив.
Для первых что-то вроде этого
$item = null;
foreach($array as $struct) {
if ($v == $struct->ID) {
$item = $struct;
break;
}
}
См. Этот вопрос и последующие ответы для получения дополнительной информации о последнем - Ссылочный массив PHP по нескольким индексам
$arr = [
[
'ID' => 1
]
];
echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)
Юркам Тим прав. Нужна только модификация: (Извините, я не могу сейчас комментировать).
После функции ($) вам нужен указатель на внешнюю переменную с помощью "use(&$seekValue)", а затем вы можете получить доступ к внешней переменной. Также вы можете изменить его.
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use (&$searchedValue) {
return $e->id == $searchedValue;
}
);
Я нашел более элегантное решение здесь. Адаптированный к вопросу это может выглядеть так:
$neededObject = array_filter(
$arrayOfObjects,
function ($e) {
return $e->id == $searchedValue;
}
);
Использование array_column для переиндексации сэкономит время, если вам нужно будет найти несколько раз:
$lookup = array_column($arr, NULL, 'id'); // re-index by 'id'
Тогда вы можете просто $lookup[$id]
по желанию.
Пытаться
$entry = current(array_filter($array, function($e) use($v){ return $e->ID==$v; }));
рабочий пример здесь
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);
Исправляя небольшую ошибку @YurkaTim, ваше решение работает для меня, но добавление use
:
Использовать $searchedValue
внутри функции одно решение может быть use ($searchedValue)
после параметров функции function ($e) HERE
,
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
Иногда мне нравится использовать функцию 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): ";
}
Способ мгновенно получить первое значение:
$neededObject = array_reduce(
$arrayOfObjects,
function ($result, $item) use ($searchedValue) {
return $item->id == $searchedValue ? $item : $result;
}
);
Я сделал это с помощью какой-то таблицы ключей 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
Я решил эту проблему, введя массив с идентификатором. Это проще и, возможно, быстрее для этого сценария, когда идентификатор - это то, что вы ищете.
[420] => stdClass Object
(
[name] => Mary
)
[10957] => stdClass Object
(
[name] => Blah
)
...
Теперь я могу напрямую обратиться к массиву:
$array[$v]->name = ...
Или, если я хочу проверить наличие идентификатора:
if (array_key_exists($v, $array)) { ...
Я разместил то, что использую для эффективного решения этой проблемы, здесь, используя быстрый алгоритм двоичного поиска: /questions/44877103/effektivnyij-sposob-poiska-obekta-v-massive-po-svojstvu/44877133#44877133
Я не хотел копировать тот же ответ. Кто-то спросил это немного по-другому, но ответ тот же.
$keyToLookFor = $term->name;
$foundField = array_filter($categories, function($field) use($keyToLookFor){
return $field -> name === $keyToLookFor; });
if(!empty($foundField)){
$ke = array_keys($foundField);
$ke = $ke[0];
$v = $foundField[$ke]->id;}
Я работаю над темой Wordpress. Получите общий комментарий из категорий, и это поможет мне с массивами