PHP에서 배열을 객체로 변환하는 방법은 무엇입니까?
이와 같은 배열을 객체로 변환하려면 어떻게해야합니까?
[128] => 배열 ( [상태] => 그림 A. Facebook의 가로 스크롤 막대는 1024x768 화면 해상도로 표시됩니다. ) [129] => 배열 ( [상태] => 다른 날 직장에서, 나는 여가 시간을 가졌다 ) )
가장 간단한 경우 배열을 객체로 "캐스트"하는 것으로 충분합니다.
$object = (object) $array;
또 다른 옵션은 표준 클래스를 변수로 인스턴스화하고 값을 다시 할당하면서 배열을 반복하는 것입니다.
$object = new stdClass();
foreach ($array as $key => $value)
{
$object->$key = $value;
}
로 에드 슨 메디나는 지적, 정말 깨끗한 솔루션은 내장 사용하는 것입니다 json_
기능 :
$object = json_decode(json_encode($array), FALSE);
이것은 또한 (반복적으로) 모든 하위 배열을 원하는 객체로 변환합니다. 불행히도 루핑 방식에 비해 2-3 배의 성능 저하가 있습니다.
경고! (의견에 대해 Ultra에게 감사드립니다) :
다른 환경의 json_decode는 UTF-8 데이터를 다른 방식으로 변환합니다. 나는 로컬에서 '240.00'의 값을 얻고 생산에서 '240'을 얻는다-대규모 재난. 변환이 실패하면 Morover는 NULL로 리턴됩니다.
타입 캐스팅을 사용하여 배열을 객체로 변환 할 수 있습니다.
// *convert array to object* Array([id]=> 321313[username]=>shahbaz)
$object = (object) $array_name;
//now it is converted to object and you can access it.
echo $object->username;
빠른 해킹 :
// assuming $var is a multidimensional array
$obj = json_decode (json_encode ($var), FALSE);
예쁘지 않지만 작동합니다.
세 가지 방법이 있습니다.
실제 물체를 위조하십시오 :
class convert { public $varible; public function __construct($array) { $this = $array; } public static function toObject($array) { $array = new convert($array); return $array; } }
배열을 오브젝트로 캐스트하여 오브젝트로 변환하십시오.
$array = array( // ... ); $object = (object) $array;
배열을 객체로 수동으로 변환하십시오.
$object = object; foreach ($arr as $key => $value) { $object->{$key} = $value; }
쉬운 방법은
$object = (object)$array;
그러나 그것은 당신이 원하는 것이 아닙니다. 물건을 원한다면 무언가를 달성하고 싶지만이 질문에는 빠져 있습니다. 객체를 사용하는 이유만으로 객체를 사용하는 것은 의미가 없습니다.
간단한 방법으로 재귀 배열에 대한 객체를 만듭니다.
$object = json_decode(json_encode((object) $yourArray), FALSE);
필요한 위치와 개체에 액세스하는 방법에 따라 다른 방법으로 수행 할 수 있습니다.
예를 들어 : 그냥 typecast
$object = (object) $yourArray;
그러나 가장 호환 가능한 방법은 유형을 지정하는 문자열을 기반으로 표준 PHP 캐스팅을 구현하는 유틸리티 메소드 (아직 PHP의 일부는 아님)를 사용하는 것입니다 (또는 값을 역 참조하는 것만 무시 함).
/**
* dereference a value and optionally setting its type
*
* @param mixed $mixed
* @param null $type (optional)
*
* @return mixed $mixed set as $type
*/
function rettype($mixed, $type = NULL) {
$type === NULL || settype($mixed, $type);
return $mixed;
}
귀하의 경우 사용 예 ( Online Demo ) :
$yourArray = Array('status' => 'Figure A. ...');
echo rettype($yourArray, 'object')->status; // prints "Figure A. ..."
내가 아는 한 내장 된 방법은 없지만 간단한 루프만큼 쉽습니다.
$obj= new stdClass();
foreach ($array as $k=> $v) {
$obj->{$k} = $v;
}
객체를 재귀 적으로 빌드하는 데 필요한 경우 설명 할 수 있습니다.
이것은 나를 위해 일했다
function array_to_obj($array, &$obj)
{
foreach ($array as $key => $value)
{
if (is_array($value))
{
$obj->$key = new stdClass();
array_to_obj($value, $obj->$key);
}
else
{
$obj->$key = $value;
}
}
return $obj;
}
function arrayToObject($array)
{
$object= new stdClass();
return array_to_obj($array,$object);
}
사용법 :
$myobject = arrayToObject($array);
print_r($myobject);
반환 :
[127] => stdClass Object
(
[status] => Have you ever created a really great looking website design
)
[128] => stdClass Object
(
[status] => Figure A.
Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
)
[129] => stdClass Object
(
[status] => The other day at work, I had some spare time
)
평소와 같이 루프를 반복 할 수 있습니다.
foreach($myobject as $obj)
{
echo $obj->status;
}
실제로 이것을 다차원 배열과 함께 사용하려면 재귀를 사용하고 싶을 것입니다.
static public function array_to_object(array $array)
{
foreach($array as $key => $value)
{
if(is_array($value))
{
$array[$key] = self::array_to_object($value);
}
}
return (object)$array;
}
나는 분명히 다음과 같이 깨끗한 방법으로 갈 것입니다 :
<?php
class Person {
private $name;
private $age;
private $sexe;
function __construct ($payload)
{
if (is_array($payload))
$this->from_array($payload);
}
public function from_array($array)
{
foreach(get_object_vars($this) as $attrName => $attrValue)
$this->{$attrName} = $array[$attrName];
}
public function say_hi ()
{
print "hi my name is {$this->name}";
}
}
print_r($_POST);
$mike = new Person($_POST);
$mike->say_hi();
?>
제출하는 경우 :
당신은 이것을 얻을 것입니다 :
위의 답변을 Objects의 답변과 비교하여보다 논리적으로 발견했습니다. (귀여운 작은 객체를 캡슐화 한) 목적으로 사용해야합니다.
또한 get_object_vars를 사용하면 조작 된 오브젝트에 추가 속성이 작성되지 않습니다 (패밀리 이름을 가진 차량이나 4 륜구동 차량을 원하지 않음).
(객체) 함수를 사용하여 배열을 객체로 변환 할 수 있습니다.
$arr= [128=> ['status'=>
'Figure A. Facebook \'s horizontal scrollbars showing up on a 1024x768 screen resolution.'],
129=>['status'=>'The other day at work, I had some spare time']];
$ArrToObject=(object)$arr;
var_dump($ArrToObject);
결과는 배열을 포함하는 객체입니다.
object (stdClass) # 1048 (2) {[128] => 배열 (1) {
[ "status"] => string (87) "그림 A. Facebook의 가로 스크롤 막대는 1024x768 화면 해상도에 표시됩니다." }
[129] => array (1) {[ "status"] => string (44) "일전에 근무 시간이 좀 남았습니다"}}
예를 들어 ArrayObject를 사용할 수도 있습니다.
<?php
$arr = array("test",
array("one"=>1,"two"=>2,"three"=>3),
array("one"=>1,"two"=>2,"three"=>3)
);
$o = new ArrayObject($arr);
echo $o->offsetGet(2)["two"],"\n";
foreach ($o as $key=>$val){
if (is_array($val)) {
foreach($val as $k => $v) {
echo $k . ' => ' . $v,"\n";
}
}
else
{
echo $val,"\n";
}
}
?>
//Output:
2
test
one => 1
two => 2
three => 3
one => 1
two => 2
three => 3
재귀는 당신의 친구입니다.
function __toObject(Array $arr) {
$obj = new stdClass();
foreach($arr as $key=>$val) {
if (is_array($val)) {
$val = __toObject($val);
}
$obj->$key = $val;
}
return $obj;
}
내가 사용하는 것 (클래스 멤버) :
const MAX_LEVEL = 5; // change it as needed
public function arrayToObject($a, $level=0)
{
if(!is_array($a)) {
throw new InvalidArgumentException(sprintf('Type %s cannot be cast, array expected', gettype($a)));
}
if($level > self::MAX_LEVEL) {
throw new OverflowException(sprintf('%s stack overflow: %d exceeds max recursion level', __METHOD__, $level));
}
$o = new stdClass();
foreach($a as $key => $value) {
if(is_array($value)) { // convert value recursively
$value = $this->arrayToObject($value, $level+1);
}
$o->{$key} = $value;
}
return $o;
}
약간 복잡하지만 확장하기 쉬운 기술 :
배열이 있다고 가정
$a = [
'name' => 'ankit',
'age' => '33',
'dob' => '1984-04-12'
];
이 배열의 속성이 다소있을 수있는 Person 클래스가 있다고 가정하십시오. 예를 들어
class Person
{
private $name;
private $dob;
private $age;
private $company;
private $city;
}
여전히 배열을 person 객체로 변경하려면 ArrayIterator Class를 사용할 수 있습니다.
$arrayIterator = new \ArrayIterator($a); // Pass your array in the argument.
이제 반복자 객체가 있습니다.
FilterIterator 클래스를 확장하는 클래스를 작성하십시오. 추상 메소드 accept를 정의해야합니다. 예를 따르십시오
class PersonIterator extends \FilterIterator
{
public function accept()
{
return property_exists('Person', parent::current());
}
}
위의 구현은 클래스에 속성이있는 경우에만 속성을 바인딩합니다.
PersonIterator 클래스에 메소드를 하나 더 추가하십시오.
public function getObject(Person $object)
{
foreach ($this as $key => $value)
{
$object->{'set' . underscoreToCamelCase($key)}($value);
}
return $object;
}
클래스에 뮤 테이터가 정의되어 있는지 확인하십시오. 이제 객체를 생성 할 위치에서이 함수를 호출 할 준비가되었습니다.
$arrayiterator = new \ArrayIterator($a);
$personIterator = new \PersonIterator($arrayiterator);
$personIterator->getObject(); // this will return your Person Object.
쉬운:
$object = json_decode(json_encode($array));
예:
$array = array(
'key' => array(
'k' => 'value',
),
'group' => array('a', 'b', 'c')
);
$object = json_decode(json_encode($array));
그러면 다음 사항이 적용됩니다.
$object->key->k === 'value';
$object->group === array('a', 'b', 'c')
내가 만든이 기능을 사용하십시오 :
function buildObject($class,$data){
$object = new $class;
foreach($data as $key=>$value){
if(property_exists($class,$key)){
$object->{'set'.ucfirst($key)}($value);
}
}
return $object;
}
용법:
$myObject = buildObject('MyClassName',$myArray);
람다 함수를 사용하여 메인 함수 내에서 'innerfunc'을 잠그기로 선택했기 때문에 PHP7이 필요합니다. 람다 함수는 재귀 적으로 호출되므로 "use (& $ innerfunc)"가 필요합니다. PHP5에서 할 수는 있지만 innerfunc를 숨길 수는 없습니다.
function convertArray2Object($defs) {
$innerfunc = function ($a) use ( &$innerfunc ) {
return (is_array($a)) ? (object) array_map($innerfunc, $a) : $a;
};
return (object) array_map($innerfunc, $defs);
}
짧막 한 농담
$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));
변수 왼쪽에 (object) 를 추가 하여 새 객체를 만들면됩니다.
<?php
$a = Array
( 'status' => " text" );
var_dump($a);
$b = (object)$a;
var_dump($b);
var_dump($b->status);
json_encode
UTF-8 이외의 데이터를 처리하는 방식 때문에 사용하는 데 문제가 있습니다. 것을주의 그것의 가치 json_encode
/의 json_encode
방법도 배열과 같은 비 연관 배열을 떠난다. 이것은 당신이 원하는 것일 수도 아닐 수도 있습니다. 나는 최근 에이 솔루션의 기능을 다시 만들 필요가 있지만 json_
기능 을 사용하지 않는 입장에 있었습니다. 내가 생각해 낸 것은 다음과 같습니다.
/**
* Returns true if the array has only integer keys
*/
function isArrayAssociative(array $array) {
return (bool)count(array_filter(array_keys($array), 'is_string'));
}
/**
* Converts an array to an object, but leaves non-associative arrays as arrays.
* This is the same logic that `json_decode(json_encode($arr), false)` uses.
*/
function arrayToObject(array $array, $maxDepth = 10) {
if($maxDepth == 0) {
return $array;
}
if(isArrayAssociative($array)) {
$newObject = new \stdClass;
foreach ($array as $key => $value) {
if(is_array($value)) {
$newObject->{$key} = arrayToObject($value, $maxDepth - 1);
} else {
$newObject->{$key} = $value;
}
}
return $newObject;
} else {
$newArray = array();
foreach ($array as $value) {
if(is_array($value)) {
$newArray[] = arrayToObject($value, $maxDepth - 1);
} else {
$newArray[] = $value;
}
}
return $newArray;
}
}
세계에서 가장 좋은 방법 :)
function arrayToObject($conArray)
{
if(is_array($conArray)){
/*
* Return array converted to object
* Using __FUNCTION__ (Magic constant)
* for recursive call
*/
return (object) array_map(__FUNCTION__, $conArray);
}else{
// Return object
return $conArray;
}
}
다른 방법을 사용하면 문제가 발생합니다. 이것이 가장 좋은 방법입니다. 당신은 본 적이 있습니다.
CakePHP에는 기본적으로 배열을 객체에 매핑하는 재귀 적 Set :: map 클래스가 있습니다. 객체가 원하는 방식으로 보이도록 배열 모양을 변경해야 할 수도 있습니다.
http://api.cakephp.org/view_source/set/#line-158
최악의 경우이 함수에서 몇 가지 아이디어를 얻을 수 있습니다.
분명히 다른 사람들의 대답을 외삽 한 것입니다. 그러나 여기에는 멀치 차원 배열을 객체로 변환하는 재귀 함수가 있습니다.
function convert_array_to_object($array){
$obj= new stdClass();
foreach ($array as $k=> $v) {
if (is_array($v)){
$v = convert_array_to_object($v);
}
$obj->{strtolower($k)} = $v;
}
return $obj;
}
그리고 기억 그 배열을 사용하여 그들은 여전히 결과 객체에서 참조 할 수있는 숫자 키를 한 경우 {}
(예 : $obj->prop->{4}->prop
)
이 모든 코드에서 영감을 얻어 특정 클래스 이름, 생성자 메서드 피하기, 'beans'패턴 및 엄격한 모드 (기존 속성 만 설정)를 지원하는 향상된 버전을 만들려고했습니다.
class Util {
static function arrayToObject($array, $class = 'stdClass', $strict = false) {
if (!is_array($array)) {
return $array;
}
//create an instance of an class without calling class's constructor
$object = unserialize(
sprintf(
'O:%d:"%s":0:{}', strlen($class), $class
)
);
if (is_array($array) && count($array) > 0) {
foreach ($array as $name => $value) {
$name = strtolower(trim($name));
if (!empty($name)) {
if(method_exists($object, 'set'.$name)){
$object->{'set'.$name}(Util::arrayToObject($value));
}else{
if(($strict)){
if(property_exists($class, $name)){
$object->$name = Util::arrayToObject($value);
}
}else{
$object->$name = Util::arrayToObject($value);
}
}
}
}
return $object;
} else {
return FALSE;
}
}
}
암호
이 기능은와 동일하게 작동합니다 json_decode(json_encode($arr), false)
.
function arrayToObject(array $arr)
{
$flat = array_keys($arr) === range(0, count($arr) - 1);
$out = $flat ? [] : new \stdClass();
foreach ($arr as $key => $value) {
$temp = is_array($value) ? $this->arrayToObject($value) : $value;
if ($flat) {
$out[] = $temp;
} else {
$out->{$key} = $temp;
}
}
return $out;
}
테스팅
테스트 1 : 플랫 어레이
$arr = ["a", "b", "c"];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));
산출:
array(
0 => 'a',
1 => 'b',
2 => 'c',
)
array(
0 => 'a',
1 => 'b',
2 => 'c',
)
테스트 2 : 객체 배열
$arr = [["a" => 1], ["a" => 1], ["a" => 1]];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));
산출:
array(
0 => stdClass::__set_state(array('a' => 1,)),
1 => stdClass::__set_state(array('a' => 1,)),
2 => stdClass::__set_state(array('a' => 1,)),
)
array(
0 => stdClass::__set_state(array('a' => 1,)),
1 => stdClass::__set_state(array('a' => 1,)),
2 => stdClass::__set_state(array('a' => 1,)),
)
테스트 3 : 대상
$arr = ["a" => 1];
var_export(json_decode($arr));
var_export($this->arrayToObject($arr));
산출:
stdClass::__set_state(array('a' => 1,))
stdClass::__set_state(array('a' => 1,))
객체에 다차원 배열. 이 코드는 Bing search API try and catch 메소드의 변환에 사용됩니다.
try {
// Perform the Web request and get the JSON response
$context = stream_context_create($options);
$results = file_get_contents($url . "?cc=" . $country . "&category=" . $type, false, $context);
$results = json_decode($results);
return response()->json($results);
} catch (\Exception $e) {
$results = array('value' => array(
(object) array(
"name" => "Unable to Retrive News",
"url" => "http://www.sample.com/",
"image" => (object) array("thumbnail" => (object) array("contentUrl" => "")),
"publishedAt" => "",
"description" => "")
)
);
$results = (object) $results;
return response()->json($results);
}
나는 아주 간단한 방법으로 그것을 해왔다.
$list_years = array();
$object = new stdClass();
$object->year_id = 1 ;
$object->year_name = 2001 ;
$list_years[] = $object;
function object_to_array($data)
{
if (is_array($data) || is_object($data))
{
$result = array();
foreach ($data as $key => $value)
{
$result[$key] = object_to_array($value);
}
return $result;
}
return $data;
}
function array_to_object($data)
{
if (is_array($data) || is_object($data))
{
$result= new stdClass();
foreach ($data as $key => $value)
{
$result->$key = array_to_object($value);
}
return $result;
}
return $data;
}
참고 URL : https://stackoverflow.com/questions/1869091/how-to-convert-an-array-to-object-in-php
'IT' 카테고리의 다른 글
SQL Server에서 한 데이터베이스에서 다른 데이터베이스로 테이블 복사 (0) | 2020.03.08 |
---|---|
교리의 기본값 (0) | 2020.03.08 |
jQuery : 외부 HTML () (0) | 2020.03.08 |
Mustache.js와 Handlebars.js의 차이점은 무엇입니까? (0) | 2020.03.08 |
java.lang.OutOfMemoryError : GC 오버 헤드 한계를 초과했습니다 (0) | 2020.03.08 |