답변:
배열을 반복하고 특정 레코드를 검색하거나 (한 번만 검색 가능) 다른 연관 배열을 사용하여 해시 맵을 작성합니다.
전자의 경우 이와 같은
$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]마음대로 할 수 있습니다 .
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
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
나는 같은 대답을 복사하고 싶지 않았습니다. 다른 사람이 약간 다르게 요청했지만 대답은 동일합니다.