개체 배열에서 개체 속성별로 항목을 찾으려면 어떻게 해야 합니까?
어레이는 다음과 같습니다.
[0] => stdClass Object
(
[ID] => 420
[name] => Mary
)
[1] => stdClass Object
(
[ID] => 10957
[name] => Blah
)
...
그리고 저는 다음과 같은 정수 변수를 가지고 있습니다.$v
.
오브젝트가 있는 어레이 엔트리를 선택하려면 어떻게 해야 합니까?ID
속성에는$v
가치?
배열을 반복하여 특정 레코드를 검색하거나(한 번에 검색으로 OK), 다른 연관 배열을 사용하여 해시 맵을 빌드할 수 있습니다.
전자의 경우 이런 식으로
$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)
위의 코드는 일치하는 요소의 인덱스를 에코합니다.false
없는 경우
대응하는 요소를 취득하려면 , 다음과 같은 조작을 실시합니다.
$i = array_search(1, array_column($arr, 'ID'));
$element = ($i !== false ? $arr[$i] : null);
array_column은 배열과 객체 배열 모두에서 작동합니다.
YurkamTim 말이 맞아요.수정만 하면 됩니다.
함수($) 후에 "use(&$searchedValue)"를 통해 외부 변수에 대한 포인터가 필요합니다.그러면 외부 변수에 액세스할 수 있습니다.또한 수정할 수도 있습니다.
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use (&$searchedValue) {
return $e->id == $searchedValue;
}
);
여기서 좀 더 우아한 해결책을 찾았어요.다음과 같은 질문에 맞게 조정됩니다.
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
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($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()와 비슷하지만 검색된 배열에는 영향을 주지 않으므로 동일한 배열의 개체에 대해 여러 검색을 수행할 수 있습니다.
$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;
}
);
자바 키맵 같은 걸로 했어요이렇게 하면 개체 배열 위에 매번 루프할 필요가 없습니다.
<?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
아이디로 어레이를 입력하여 이 문제를 해결했습니다.원하는 ID가 있는 시나리오에서는 더 간단하고 더 빠를 수 있습니다.
[420] => stdClass Object
(
[name] => Mary
)
[10957] => stdClass Object
(
[name] => Blah
)
...
이제 어레이에 직접 주소를 지정할 수 있습니다.
$array[$v]->name = ...
또는 ID의 존재를 확인하는 경우:
if (array_key_exists($v, $array)) { ...
$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 테마 작업 중 Catagories에서 토탈 코멘트를 얻으면 어레이에 도움이 됩니다.
언급URL : https://stackoverflow.com/questions/4742903/how-to-find-entry-by-object-property-from-an-array-of-objects
'programing' 카테고리의 다른 글
Android 목록 기본 설정: 요약을 선택한 값으로 지정하시겠습니까? (0) | 2022.11.06 |
---|---|
PHP의 특징 – 실제 사례/베스트 프랙티스가 있습니까? (0) | 2022.11.06 |
MySQL 구문 혼동 - 단일 행 삽입을 위한 간단한 데이터 병합 (0) | 2022.11.06 |
로컬 호스트 PHPmyAdmin에 저장 프로시저를 만들고 있는데 찾을 수 없는 오류가 있습니다. (0) | 2022.11.06 |
HTML5 캔버스와SVG와 div (0) | 2022.11.06 |