回答:
配列を反復して特定のレコードを検索するか(1回限りの検索でもOK)、別の連想配列を使用してハッシュマップを作成します。
前者の場合、このようなもの
$item = null;
foreach($array as $struct) {
if ($v == $struct->ID) {
$item = $struct;
break;
}
}
後者の詳細については、この質問とその後の回答を参照してください- 複数のインデックスによるPHP配列の参照
isset($item)
が、変数を適切に初期化することを好みます
if($v == $struct["ID"]){...
YurkamTimは正しいです。変更のみが必要です。
function($)の後には、「use(&$ searchedValue)」による外部変数へのポインタが必要であり、外部変数にアクセスできます。また、変更することもできます。
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use (&$searchedValue) {
return $e->id == $searchedValue;
}
);
&
インポート時に必要とされていない$searchedValue
閉鎖スコープに。&
場合にのみ必要とされる基準を作成するために使用される$searchedValue
閉鎖内部修飾されているが。
global
関数を使ってデータを共有することが唯一の使い方だと思いました!しかし、これが本当に遅いのは残念です。:(
$arr = [
[
'ID' => 1
]
];
echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)
私はここでよりエレガントな解決策を見つけました。それは次のようになるかもしれない質問に適応しました:
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
return $e->id == $searchedValue;
}
);
array_filter
は配列を返し、最初に見つかった値で停止しません。
$searchedValue
関数内では認識していません。しかし、それは外です。
$searchedValue
、クロージャースコープの外では機能しません。次に、これらの配列メソッドはどのように機能すると思いますか?それらはすべて内部的にアレイをループします
$searchedValue
必要の書き込みfunction ($e) use ($searchedValue) {
array_columnを使用してインデックスを再作成すると、複数回検索する必要がある場合に時間を節約できます。
$lookup = array_column($arr, NULL, 'id'); // re-index by 'id'
次に、あなたは簡単に自由にできます$lookup[$id]
。
@YurkaTimの小さな間違いを修正すると、あなたの解決策は私にとってはうまくいきますが、追加しuse
ます:
$searchedValue
関数内で使用するには、use ($searchedValue)
関数パラメーターの後に1つの解決策があります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
var_dump($neededObject);
:)である必要があると思います
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): ";
}
if ($current_item->someProperty == $needle){ $result_array[] = $current_item; }
私はある種の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
この問題を効率的に解決するために使用しているものを、クイックバイナリ検索アルゴリズムを使用してここに投稿しました:https : //stackoverflow.com/a/52786742/1678210
同じ答えをコピーしたくありませんでした。他の誰かが少し異なってそれを要求しましたが、答えは同じです。