配列は次のようになります。
[0] => stdClass Object
(
[ID] => 420
[name] => Mary
)
[1] => stdClass Object
(
[ID] => 10957
[name] => Blah
)
...
そして、$v
という整数変数があります。
ID
プロパティが$v
値を持つオブジェクトを持つ配列エントリを選択するにはどうすればよいですか?
配列を反復して特定のレコードを検索する(1回限りの検索で問題ありません)か、別の連想配列を使用してハッシュマップを作成します。
前者については、このようなもの
$item = null;
foreach($array as $struct) {
if ($v == $struct->ID) {
$item = $struct;
break;
}
}
後者の詳細については、この質問とそれに続く回答を参照してください- 複数のインデックスによるPHP配列の参照
YurkamTim が正しい。変更するだけです。
Function($)の後、「use(&$ searchedValue)」によって外部変数へのポインターが必要になり、外部変数にアクセスできます。また、変更することもできます。
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use (&$searchedValue) {
return $e->id == $searchedValue;
}
);
よりエレガントな解決策を見つけました こちら 。質問に適応すると、次のようになります。
$neededObject = array_filter(
$arrayOfObjects,
function ($e) {
return $e->id == $searchedValue;
}
);
$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]
を自由に実行できます。
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($neededObject); // 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($neededObject); // To see the output
array_reduce() 関数を使用して検索を実行することが好きな場合があります。 array_filter()に似ていますが、検索された配列には影響しないため、同じオブジェクトの配列でmultiple検索を実行できます。
$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): ";
}
何らかの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
すぐに最初の値を取得する方法:
$neededObject = array_reduce(
$arrayOfObjects,
function ($result, $item) use ($searchedValue) {
return $item->id == $searchedValue ? $item : $result;
}
);
クイックバイナリ検索アルゴリズムを使用して、この問題を効率的に解決するために使用するものをここに投稿しました。 https://stackoverflow.com/a/52786742/167821
同じ答えをコピーしたくありませんでした。他の誰かがそれをわずかに異なって尋ねましたが、答えは同じです。