Làm thế nào để chuyển đổi một mảng thành đối tượng trong PHP?


367

Làm thế nào tôi có thể chuyển đổi một mảng như thế này sang đối tượng?

[128] => Array
    (
        [status] => Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
    )

[129] => Array
    (
        [status] => The other day at work, I had some spare time
    )

4
Chính xác thì bạn muốn lấy loại đối tượng nào? Ý tôi là: các thuộc tính nên là gì?
Pascal MARTIN

trong một vòng lặp nên cả hai vì trạng thái là một mảng dữ liệu nên cả hai đều là printet
streetparade

không chắc chắn từ khi nào, nhưng điều này chỉ hoạt động:$a = (object)['hello' => 'world'];
Nishchal Gautam

Câu trả lời:


588

Trong trường hợp đơn giản nhất, có lẽ đủ để "truyền" mảng thành một đối tượng:

$object = (object) $array;

Một tùy chọn khác là khởi tạo một lớp tiêu chuẩn dưới dạng một biến và lặp qua mảng của bạn trong khi gán lại các giá trị:

$object = new stdClass();
foreach ($array as $key => $value)
{
    $object->$key = $value;
}

Như Edson Medina đã chỉ ra, một giải pháp thực sự sạch sẽ là sử dụng các json_chức năng tích hợp:

$object = json_decode(json_encode($array), FALSE);

Điều này cũng (đệ quy) chuyển đổi tất cả các mảng con của bạn thành các đối tượng mà bạn có thể muốn hoặc không muốn. Thật không may, nó có hiệu suất 2-3 lần so với phương pháp lặp.

Cảnh báo! (cảm ơn Ultra đã bình luận):

json_decode trên các môi trường khác nhau chuyển đổi dữ liệu UTF-8 theo các cách khác nhau. Cuối cùng, tôi nhận được các giá trị '240,00' tại địa phương và '240' khi sản xuất - nhà phân phối lớn. Thay đổi nếu chuyển đổi không thành công, chuỗi được trả về là NULL


41
"vì các biến không thể bắt đầu bằng số", vâng, chúng có thể: $ object -> {3} = 'xyz';
chelmertz

11
"có hiệu suất 2-3 lần" Đây là một so sánh không công bằng, vì phương thức sau trả về các đối tượng đệ quy, trong khi phương pháp lặp không có điều kiện tiếp theo (như trong câu trả lời của @streetparade) chỉ chuyển đổi cấp độ đầu tiên.
feeela

8
@feeela Tôi không nghĩ nó không công bằng chút nào .. tôi đã đề cập rằng nó thực hiện chuyển đổi theo cách đệ quy. Ngoài ra, cú đánh hiệu suất 2-3 lần đã đến khi sử dụng một mảng đầu vào phẳng (sẽ không sử dụng bất kỳ đệ quy nào)
jlb

6
CẢNH BÁO! json_decode trên các môi trường khác nhau chuyển đổi dữ liệu UTF-8 theo các cách khác nhau. Cuối cùng, tôi nhận được các giá trị '240,00' tại địa phương và '240' khi sản xuất - nhà phân phối lớn. Thay đổi nếu chuyển đổi không thành công, chuỗi được trả về là NULL
Szymon Toda

1
Lưu ý khi sử dụng các hàm json_ *: tham chiếu (ví dụ: các mảng khác) được lưu trữ trong mảng ban đầu sẽ được sao chép trong trường hợp này. Nói khóa xtrong mảng giữ tham chiếu đến mảng khác. Sau đó, $object->xsau khi thực hiện một lớp lót của bạn sẽ là một bản sao $array['x'], không còn là một tham chiếu đến mảng ban đầu. Điều này có thể vô hại trong một số ứng dụng, nhưng đối với các mảng lớn, nó gây lãng phí bộ nhớ và có thể gây rối khi thực thi nếu tham chiếu được sử dụng sau này.
Coprolal

153

bạn chỉ có thể sử dụng kiểu truyền để chuyển đổi một mảng thành đối tượng.

// *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;

107

Cách dễ dàng sẽ là

$object = (object)$array;

Nhưng đó không phải là điều bạn muốn. Nếu bạn muốn các đối tượng bạn muốn đạt được một cái gì đó, nhưng điều đó bị thiếu trong câu hỏi này. Sử dụng các đối tượng chỉ vì lý do sử dụng các đối tượng không có ý nghĩa.


2
không hoạt động, tôi đã làm điều đó trước khi tôi đặt câu hỏi ở đây vì vậy phải có một cách khác để làm
đường phố

20
Tại sao anh ta phải đưa ra lý do của mình vì muốn sử dụng đồ vật? Tôi không nghĩ rằng nó có liên quan đến cách nó được thực hiện. Có lẽ anh ta cần json_encode chúng, hoặc tuần tự hóa chúng? Có thể có hàng tá lý do để làm điều này.
zombat

hmm .. tôi nhìn vào đầu ra của trình duyệt, nó trông giống như đối tượng này (stdClass) # 150 (130) {[0] => mảng (1) {["status"] => chuỗi (130) "Ở Mac cuối cùng và Người dùng Linux không cần phải cảm thấy như công dân hạng hai ở vùng đất Chrome: họ đã có phiên bản beta chính thức beta "} chính thức là một đối tượng nhưng làm thế nào để lặp lại điều này để tôi có thể xác nhận trạng thái như $ obj-> trạng thái bất kỳ ý tưởng nào ?
đường phố

zombat, mã hóa JSON không phải là lý do để sử dụng một đối tượng, có một cờ để json_encode () để sử dụng các đối tượng. với tuần tự hóa, người ta sẽ cần một loại đối tượng cụ thể mà người nhận mong đợi. Và nói chung tôi cố gắng giúp đỡ với vấn đề thực tế . Đối với tôi câu hỏi này ngụ ý rằng có một lỗi kiến ​​trúc ở một nơi khác.
johannes

một điều tuyệt vời, làm việc với mảng laravel cho vấn đề đối tượng
Anthony Kal

105

Hack nhanh:

// assuming $var is a multidimensional array
$obj = json_decode (json_encode ($var), FALSE);

Không xinh, nhưng hoạt động.


2
Tôi thực sự thích giải pháp này, sử dụng các hàm tích hợp thay vì do người dùng định nghĩa luôn nhanh hơn và cách này hoạt động rất tốt. Cảm ơn vì tiền hỗ trợ.
aknatn

@Oddant Điều này giải quyết vấn đề được đề cập ở trên (chuyển đổi một mảng thành một đối tượng). Bài hát của bạn nên được hướng vào bài chính, không phải giải pháp của tôi.
Edson Medina

@EdsonMedina Tôi đã làm, bài viết của tôi là quá xuống mặc dù.
vdegenne

1
@Oddant, để công bằng cho @EdsonMedina, câu hỏi ban đầu không chỉ định mức độ hiển thị mà các thuộc tính cần, và vì OP không sử dụng $thistrong các bình luận theo sau là người truy cập, nên anh ấy / cô ấy mong muốn một stdClassví dụ là đầu ra chứ không phải một lớp do người dùng định nghĩa như câu trả lời của bạn sử dụng. Tôi đồng ý về sự thanh lịch của giải pháp này, nhưng thật không may, đó là một mô hình được sử dụng khá phổ biến để giải quyết vấn đề này với các mảng lồng nhau trong đó việc truyền vào đối tượng sẽ không hoạt động. Cũng có thể OP đang sử dụng một giao diện yêu cầu và đối tượng làm đầu vào chứ không phải là một mảng.
DeaconDesperado

3
Đừng quên rằng sử dụng theo cách này bạn sẽ mất tất cả trừ các loại cơ bản. DateTime sẽ được chuyển đổi stdObject chẳng hạn.
Denis Pshenov 04/11 '

97

Dưới đây là ba cách:

  1. Giả mạo một đối tượng thực sự:

    class convert
    {
        public $varible;
    
        public function __construct($array)
        {
            $this = $array;
        }
    
        public static function toObject($array)
        {
            $array = new convert($array);
            return $array;
        }
    }
  2. Chuyển đổi mảng thành một đối tượng bằng cách chuyển nó thành một đối tượng:

    $array = array(
        // ...
    );
    $object = (object) $array;
  3. Chuyển đổi thủ công mảng thành một đối tượng:

    $object = object;
    foreach ($arr as $key => $value) {
        $object->{$key} = $value;
    }

2
hmm cảm ơn nhưng lớp khuôn mặt của bạn đưa ra lỗi sau Lỗi nghiêm trọng: Không thể gán lại $ this trong /var/www/bot/inc/twitter-bot.php trên dòng 10
streetparade

1
và tham chiếu typcasint @ không phải là một ý tưởng hay ngay cả khi nó không hoạt động ở đây là điều tôi nhận được bất ngờ T_OB DỰ_CAST, mong đợi T_NEW hoặc T_STRING hoặc T_VARIABLE hoặc '$'
streetparade

2
$ mảng = & (đối tượng) $ mảng == triển khai KISS tốt đẹp!
mate64

16
Tại sao bất cứ ai cũng muốn sử dụng một phương pháp khác hơn 2)? Có bất kỳ nhược điểm?
Yogu

7
typecasting một mảng vào đối tượng không hoạt động trên các mảng lồng nhau
minhajul

34

Cách đơn giản, Điều này cũng sẽ tạo một đối tượng cho các mảng đệ quy:

$object = json_decode(json_encode((object) $yourArray), FALSE);

4
chuyển falseđến json_decode()sẽ trả về một mảng kết hợp.
Rust

3
@ user3284463 Chuyển trueđến json_decodesẽ trả về một mảng kết hợp, falselà mặc định và sẽ trả về một StdClassthể hiện.
Elliot Reed

23

Tùy thuộc vào nơi bạn cần điều đó và làm thế nào để truy cập vào đối tượng, có nhiều cách khác nhau để làm điều đó.

Ví dụ: chỉ cần gõ nó

$object =  (object) $yourArray;

Tuy nhiên, cách tương thích nhất là sử dụng một phương thức tiện ích (chưa phải là một phần của PHP) thực hiện việc đúc PHP tiêu chuẩn dựa trên một chuỗi xác định loại (hoặc bằng cách bỏ qua nó chỉ tham chiếu giá trị):

/**
 * 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;
}

Ví dụ sử dụng trong trường hợp của bạn ( Bản demo trực tuyến ):

$yourArray = Array('status' => 'Figure A. ...');

echo rettype($yourArray, 'object')->status; // prints "Figure A. ..."

17

Cái này làm việc cho tôi

  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);
}

sử dụng :

$myobject = arrayToObject($array);
print_r($myobject);

trả về:

    [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
        )

như thường lệ, bạn có thể lặp nó như sau:

foreach($myobject as $obj)
{
  echo $obj->status;
}

Nhưng cái này chậm hơn khoảng 500% (đã được kiểm tra) so với kiểu truyền: $ obj = (object) $ mảng;
xZero

@xZero nhưng $obj = (object) $array;không hoạt động cho mảng nhiều chiều.
Jeff Puckett

15

Không có phương pháp tích hợp nào để thực hiện theo như tôi biết, nhưng nó dễ như một vòng lặp đơn giản:

    $obj= new stdClass();

    foreach ($array as $k=> $v) {
        $obj->{$k} = $v;
    }

Bạn có thể giải thích về điều đó nếu bạn cần nó để xây dựng đối tượng của mình một cách đệ quy.


14

Bạn có thể sử dụng hàm (object) để chuyển mảng của mình thành đối tượng.

$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);

Kết quả sẽ là một đối tượng có chứa các mảng:

đối tượng (stdClass) # 1048 (2) {[128] => mảng (1) {

["status"] => chuỗi (87) "Hình A. Thanh cuộn ngang của Facebook hiển thị trên độ phân giải màn hình 1024x768." }

[129] => mảng (1) {["status"] => chuỗi (44) "Một ngày khác tại nơi làm việc, tôi có thời gian rảnh"}}


9

Trên thực tế nếu bạn muốn sử dụng điều này với các mảng đa chiều, bạn sẽ muốn sử dụng một số đệ quy.

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;
}

8

Tôi chắc chắn sẽ đi với một cách sạch sẽ như thế này:

<?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();

?>

nếu bạn gửi:

formulaire

bạn sẽ nhận được điều này:

mike

Tôi thấy điều này hợp lý hơn khi so sánh các câu trả lời trên từ các Đối tượng nên được sử dụng cho mục đích mà chúng được tạo ra (đóng gói các đối tượng nhỏ dễ thương).

Ngoài ra, sử dụng get_object_vars đảm bảo rằng không có thuộc tính bổ sung nào được tạo trong Đối tượng bị thao túng (bạn không muốn một chiếc xe có tên gia đình, cũng không phải một người cư xử với 4 bánh xe).


Tại sao bạn không sử dụng $ attr_value thay vì $ mảng [$ attr_name]; trong hàm yourpublic hàm from_array ($ mảng)
Sakkeer Hussain

7

Bạn cũng có thể sử dụng ArrayObject, ví dụ:

<?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

1
Theo ý kiến ​​của tôi điều này nên trở thành câu trả lời tốt nhất. Thông tin thêm Herre: php.net/manual/en/arrayobject.construct.php
Julian

7

Cái tôi sử dụng (nó là một thành viên trong lớp):

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;
}

7

Ít phức tạp nhưng dễ mở rộng kỹ thuật:

Giả sử bạn có một mảng

$a = [
     'name' => 'ankit',
     'age' => '33',
     'dob' => '1984-04-12'
];

Giả sử bạn có một lớp Person có thể có nhiều hoặc ít thuộc tính từ mảng này. ví dụ

class Person 
{
    private $name;
    private $dob;
    private $age;
    private $company;
    private $city;
}

Nếu bạn vẫn muốn thay đổi mảng của bạn thành đối tượng người. Bạn có thể sử dụng Lớp ArrayIterator.

$arrayIterator = new \ArrayIterator($a); // Pass your array in the argument.

Bây giờ bạn có đối tượng lặp.

Tạo một lớp FilterIterator mở rộng; nơi bạn phải xác định phương thức trừu tượng chấp nhận. Làm theo ví dụ

class PersonIterator extends \FilterIterator
{
    public function accept()
    {
        return property_exists('Person', parent::current());
    }
}

Sự khắc phục ở trên sẽ ràng buộc tài sản chỉ khi nó tồn tại trong lớp.

Thêm một phương thức nữa trong lớp PersonIterator

public function getObject(Person $object)
{
        foreach ($this as $key => $value)
        {
            $object->{'set' . underscoreToCamelCase($key)}($value);
        }
        return $object;
}

Hãy chắc chắn rằng bạn có các trình biến đổi được định nghĩa trong lớp của bạn. Bây giờ bạn đã sẵn sàng để gọi các hàm này, nơi bạn muốn tạo đối tượng.

$arrayiterator = new \ArrayIterator($a);
$personIterator = new \PersonIterator($arrayiterator);

$personIterator->getObject(); // this will return your Person Object. 

6

đệ quy là bạn của bạn:

function __toObject(Array $arr) {
    $obj = new stdClass();
    foreach($arr as $key=>$val) {
        if (is_array($val)) {
            $val = __toObject($val);
        }
        $obj->$key = $val;
    }

    return $obj;
}

6

Điều này đòi hỏi PHP7 vì tôi đã chọn sử dụng hàm lambda để khóa 'hàm bên trong' trong hàm chính. Hàm lambda được gọi đệ quy, do đó cần: "use (& $ Internalfunc)". Bạn có thể làm điều đó trong PHP5 nhưng không thể ẩn phần bên trong.

function convertArray2Object($defs) {
    $innerfunc = function ($a) use ( &$innerfunc ) {
       return (is_array($a)) ? (object) array_map($innerfunc, $a) : $a; 
    };
    return (object) array_map($innerfunc, $defs);
}

5

sử dụng chức năng này mà tôi đã thực hiện:

function buildObject($class,$data){
    $object = new $class;
    foreach($data as $key=>$value){
        if(property_exists($class,$key)){
            $object->{'set'.ucfirst($key)}($value);
        }
    }
    return $object;
}

Sử dụng:

$myObject = buildObject('MyClassName',$myArray);

5

lót

$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));

1
Lưu ý rằng các tham chiếu (ví dụ như các mảng khác) được lưu trữ trong mảng ban đầu sẽ được sao chép bằng một lớp lót này. Nói khóa xtrong mảng giữ tham chiếu đến mảng khác. Sau đó, $object->xsau khi thực hiện một lớp lót của bạn sẽ là một bản sao $result_array['x'], không phải là mảng giống hệt nhau.
Coprolal

4

Dễ dàng:

$object = json_decode(json_encode($array));

Thí dụ:

$array = array(
    'key' => array(
        'k' => 'value',
    ),
    'group' => array('a', 'b', 'c')
);

$object = json_decode(json_encode($array));

Sau đó, điều sau đây là đúng:

$object->key->k === 'value';
$object->group === array('a', 'b', 'c')

1
Tôi nghĩ rằng đây là một cách giải quyết. Tại sao mã hóa một mảng thành json và sau đó giải mã nó? Nó không phải là một quyết định tối ưu với tôi.
Julian

1
@Julian, vì nó hoạt động đệ quy, theo cách được xác định đúng và đủ độ tin cậy ("tiêu chuẩn"), và cũng đủ nhanh để trở thành một lựa chọn tốt cho ma thuật khỉ được mã hóa ngẫu nhiên.
Sz.

3

Bạn cũng có thể làm điều này bằng cách thêm (đối tượng) bên trái biến để tạo một đối tượng mới.

<?php
$a = Array
    ( 'status' => " text" );
var_dump($a);
$b = (object)$a;
var_dump($b);
var_dump($b->status);

http://codepad.org/9YmD1KsU


1
có lẽ đáng để đề cập đến điều này được gọi là "đúc" hoặc "đúc kiểu": php.net/manual/en/ và hành vi của (đối tượng) mảng () được ghi lại ở đây: php.net/manual/en/iêu
Pete

2

Việc sử dụng json_encodelà có vấn đề vì cách nó xử lý dữ liệu không phải UTF-8. Điều đáng chú ý là phương thức json_encode/ json_encodecũng để các mảng không liên kết thành các mảng. Điều này có thể hoặc không thể là những gì bạn muốn. Gần đây tôi đã ở vị trí cần phải tạo lại chức năng của giải pháp này nhưng không sử dụng các json_chức năng. Đây là những gì tôi nghĩ ra:

/**
 * 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;
    }
}

2

Phương pháp tốt nhất trên THẾ GIỚI :)

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;
    }
}

Nếu bạn sử dụng các phương pháp khác nhau, bạn sẽ có vấn đề. Đây là phương pháp tốt nhất. Bạn đã từng thấy.


2

Mảng đa chiều vào một đối tượng. mã này được sử dụng để chuyển đổi phương pháp thử và bắt API tìm kiếm Bing.

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);
    }

2

Bạn có thể sử dụng Reflection:

<?php

$array = ['name'=>'maria','age'=>33];

class Person {

    public $name;
    public $age;

    public function __construct(string $name, string $age){
        $this->name  = $name;
        $this->age = $age;
    }
}

function arrayToObject(array $array, string $class_name){

    $r = new ReflectionClass($class_name);
    $object = $r->newInstanceWithoutConstructor();
    $list = $r->getProperties();
    foreach($list as $prop){
      $prop->setAccessible(true);
      if(isset($array[$prop->name]))
        $prop->setValue($object, $array[$prop->name]);
    } 

    return $object;

}

$pessoa1 = arrayToObject($array, 'Person');
var_dump($pessoa1);

1

CakePHP có một lớp đệ quy :: lớp bản đồ về cơ bản ánh xạ một mảng vào một đối tượng. Bạn có thể cần phải thay đổi các mảng trông như thế nào để làm cho đối tượng trông giống như bạn muốn.

http://api.cakephp.org/view_source/set/#line-158

Trường hợp xấu nhất, bạn có thể có được một vài ý tưởng từ chức năng này.


1

Rõ ràng chỉ là phép ngoại suy của một số câu trả lời của những người khác, nhưng đây là hàm đệ quy sẽ chuyển đổi bất kỳ mảng chiều nào thành một đối tượng:

   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;
   }

Và hãy nhớ rằng nếu mảng có các khóa số, chúng vẫn có thể được tham chiếu trong đối tượng kết quả bằng cách sử dụng {}(ví dụ $obj->prop->{4}->prop:)


1

Lấy cảm hứng từ tất cả các mã này, tôi đã cố gắng tạo một phiên bản nâng cao với sự hỗ trợ: tên lớp cụ thể, tránh phương thức hàm tạo, mẫu 'đậu' và chế độ nghiêm ngặt (chỉ đặt các thuộc tính hiện có):

    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;
        }
        }
}

1

Chức năng này hoạt động tương tự như 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;
}

Kiểm tra

Kiểm tra 1: Mảng phẳng

$arr = ["a", "b", "c"];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));

Đầu ra:

array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
)
array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
)

Kiểm tra 2: Mảng đối tượng

$arr = [["a" => 1], ["a" => 1], ["a" => 1]];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));

Đầu ra:

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,)),
)

Bài kiểm tra 3: Đối tượng

$arr = ["a" => 1];
var_export(json_decode($arr));
var_export($this->arrayToObject($arr));

Đầu ra:

stdClass::__set_state(array('a' => 1,))
stdClass::__set_state(array('a' => 1,))

0

tôi đã làm nó với cách khá đơn giản,

    $list_years         = array();
    $object             = new stdClass();

    $object->year_id   = 1 ;
    $object->year_name = 2001 ;
    $list_years[]       = $object;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.