Chuyển mảng thành object php

answer

15

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

15 hữu ích 2 bình luận chia sẻ

answer

477

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

477 hữu ích 5 bình luận chia sẻ

answer

146

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;

146 hữu ích 1 bình luận chia sẻ

answer

93

Hack nhanh:

// assuming $var is a multidimensional array
$obj = json_decode [json_encode [$var], FALSE];

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

93 hữu ích 5 bình luận chia sẻ

answer

93

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

93 hữu ích 5 bình luận chia sẻ

answer

83

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.

83 hữu ích 5 bình luận chia sẻ

answer

29

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

29 hữu ích 2 bình luận chia sẻ

answer

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. ..."

23 hữu ích 1 bình luận chia sẻ

answer

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.

15 hữu ích 0 bình luận chia sẻ

answer

8

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 hữu ích 0 bình luận chia sẻ

answer

6

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

nếu bạn gửi:

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

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 như một người cư xử với 4 bánh xe].

6 hữu ích 1 bình luận chia sẻ

answer

5

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



//Output:
  2
  test
  one => 1
  two => 2
  three => 3
  one => 1
  two => 2
  three => 3

5 hữu ích 1 bình luận chia sẻ

answer

5

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

5 hữu ích 0 bình luận chia sẻ

answer

5

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

5 hữu ích 0 bình luận chia sẻ

answer

5

Í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. 

5 hữu ích 0 bình luận chia sẻ

answer

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']

4 hữu ích 2 bình luận chia sẻ

answer

4

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

4 hữu ích 1 bình luận chia sẻ

answer

4

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

4 hữu ích 0 bình luận chia sẻ

answer

2

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.

Chủ Đề