PHP - 개체 배열에서 속성 추출
고양이 물건이 여러 개 있어요.
$cats = Array
(
[0] => stdClass Object
(
[id] => 15
),
[1] => stdClass Object
(
[id] => 18
),
[2] => stdClass Object
(
[id] => 23
)
)
고양이 ID를 한 줄로 배열하고 싶다(함수도 아니고 루프도 아니다).
array_walk
create_function
츠키노
감 잡히는 게 없어요?
만약 당신이 PHP 5.5 이후를 가지고 있다면, 가장 좋은 방법은 빌트인 함수를 사용하는 것입니다.array_column()
:
$idCats = array_column($cats, 'id');
하지만 아들은 배열이거나 배열로 변환되어야 합니다.
★★★
create_function()
는 PHP 7.2되었습니다.이 기능에 의존하는 것은 매우 권장되지 않습니다.
기능을 사용할 수 있습니다.
이것으로 충분합니다.
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
@Releasequestary writes는 다음과 같이 함수가 array_map에 직접 통합되었습니다.솔루션의 새로운 버전은 다음과 같습니다.
$catIds = array_map(function($o) { return $o->id;}, $objects);
솔루션은 사용 중인 PHP 버전에 따라 달라집니다.최소 2가지 솔루션이 있습니다.
첫 번째(새로운 PHP 버전)
【 최단인 해결책 앞에 말한 것은 【알시나】를 사용하는 입니다.array_column
음음음같 뭇매하다
$catIds = array_column($objects, 'id');
주의: 재작성 시array
\stdClass
처럼 PHP 합니다.>= 7.0
단, 을 하는 .array
array
는 PHP의 PHP를 사용하므로 동일한 할 수 .>= 5.5
.
두 번째(이전 PHP 버전)
@Greg는 이전 PHP 버전에서는 다음을 수행할 수 있다고 말했습니다.
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
단, 주의:새로운 PHP 버전>= 5.3.0
하는 Closure
s, 다, 다, 다, 니, ,, ,, ,, ,, ,.
$catIds = array_map(function($o) { return $o->id; }, $objects);
차이점
첫 번째 솔루션은 새로운 기능을 생성하여 RAM에 저장합니다.가비지 컬렉터는 어떤 이유로 이미 생성되고 호출된 함수 인스턴스를 메모리 부족으로 삭제하지 않습니다.또한 생성된 함수 인스턴스는 포인터가 없기 때문에 다시 호출할 수 없습니다.그리고 다음에 이 코드가 호출되면 동일한 함수가 다시 생성됩니다.이 행동은 당신의 기억을 서서히 채웁니다.
비교하기 위한 메모리 출력의 예는 다음과 같습니다.
나빠
while (true)
{
$objects = array_map(create_function('$o', 'return $o->id;'), $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235616
4236600
4237560
4238520
...
좋아요.
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
이는 여기서도 설명할 수 있습니다.
메모리 유출?!'array_map' 내에서 'create_function'을 사용할 때 Garbage Collector가 제대로 작동합니까?
function extract_ids($cats){
$res = array();
foreach($cats as $k=>$v) {
$res[]= $v->id;
}
return $res
}
한 줄로 사용합니다.
$ids = extract_ids($cats);
코드
<?php
# setup test array.
$cats = array();
$cats[] = (object) array('id' => 15);
$cats[] = (object) array('id' => 18);
$cats[] = (object) array('id' => 23);
function extract_ids($array = array())
{
$ids = array();
foreach ($array as $object) {
$ids[] = $object->id;
}
return $ids;
}
$cat_ids = extract_ids($cats);
var_dump($cats);
var_dump($cat_ids);
?>
산출량
# var_dump($cats);
array(3) {
[0]=>
object(stdClass)#1 (1) {
["id"]=>
int(15)
}
[1]=>
object(stdClass)#2 (1) {
["id"]=>
int(18)
}
[2]=>
object(stdClass)#3 (1) {
["id"]=>
int(23)
}
}
# var_dump($cat_ids);
array(3) {
[0]=>
int(15)
[1]=>
int(18)
[2]=>
int(23)
}
루프를 사용하는 건 알지만 그게 가장 간단한 방법이야!그리고 함수를 사용해도 여전히 한 줄로 끝납니다.
오우조 굿즈로 간단하게 할 수 있습니다.
$result = array_map(Functions::extract()->id, $arr);
또는 어레이 포함(Ouzo goody에서 제공)
$result = Arrays::map($arr, Functions::extract()->id);
http://ouzo.readthedocs.org/en/latest/utils/functions.html#extract에서 확인하세요.
ouzo를 사용한 기능 프로그래밍도 참조하십시오(링크를 게시할 수 없습니다).
경고
create_function()
는 PHP 7.2.0에서 폐지되었습니다.이 기능에 의존하는 것은 매우 권장되지 않습니다.
PHP에 내장된 루프는 해석된 루프보다 빠르기 때문에 이 루프를 원라이너로 하는 것이 실제로 의미가 있습니다.
$result = array();
array_walk($cats, create_function('$value, $key, &$result', '$result[] = $value->id;'), $result)
$object = new stdClass();
$object->id = 1;
$object2 = new stdClass();
$object2->id = 2;
$objects = [
$object,
$object2
];
$ids = array_map(function ($object) {
/** @var YourEntity $object */
return $object->id;
// Or even if you have public methods
// return $object->getId()
}, $objects);
출력: [1, 2]
// $array that contain records and id is what we want to fetch a
$ids = array_column($array, 'id');
이 함수는 php v7.2.0으로 권장되지 않습니다.를 지정대로 사용할 수 있습니다.
function getObjectID($obj){
return $obj->id;
}
$IDs = array_map('getObjectID' , $array_of_object);
또는 column_key로 식별되는 입력의 단일 열에서 값을 반환하는 함수를 사용할 수 있습니다.임의로 index_key를 제공하여 입력 배열의 index_key 열에서 반환된 배열의 값을 인덱스할 수 있습니다.지정된 대로 array_column을 사용할 수 있습니다.
$IDs = array_column($array_of_object , 'id');
언급URL : https://stackoverflow.com/questions/1118994/php-extracting-a-property-from-an-array-of-objects
'programing' 카테고리의 다른 글
Matplotlib에서 그림 제목 및 축 레이블 글꼴 크기를 설정하려면 어떻게 해야 합니까? (0) | 2022.10.21 |
---|---|
마리아답:내 쿼리에서 인덱스를 사용하지 않는 이유는 무엇입니까? (0) | 2022.10.21 |
Java 동기 스태틱메서드: 객체 또는 클래스에 대한 잠금 (0) | 2022.10.21 |
Javascript를 사용하여 통화 문자열을 더블로 변환하는 방법은 무엇입니까? (0) | 2022.10.21 |
Mac OS X 10.6.4에서 Python 2.7을 제거하는 방법은 무엇입니까? (0) | 2022.10.21 |