Chuyển mảng thành object php

answer

15

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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:

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

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

answer

5

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

Í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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

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

Chuyển mảng thành object php

Đ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

Chuyển mảng thành object php

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

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

answer

2

Chuyển mảng thành object php

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

answer

2

Chuyển mảng thành object php

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

answer

2

Chuyển mảng thành object php

lót

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

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

answer

1

Chuyển mảng thành object php

CakePHP có một lớp đệ quy :: lớp ánh xạ 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 hữu ích 0 bình luận chia sẻ

answer

1

Chuyển mảng thành object php

Rõ ràng chỉ là phép ngoại suy một số câu trả lời của một số 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 hữu ích 0 bình luận chia sẻ

answer

1

Chuyển mảng thành object php

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

answer

1

Chuyển mảng thành object php

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

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

answer

0

Chuyển mảng thành object php

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;

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

answer

0

Chuyển mảng thành object php

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

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

answer

0

Chuyển mảng thành object php

Bằng cách sử dụng (mảng) và (đối tượng) làm tiền tố, bạn chỉ cần chuyển đổi mảng đối tượng thành mảng tiêu chuẩn và ngược lại

php
//defining an array
$a = array('a'=>'1','b'=>'2','c'=>'3','d'=>'4');

//defining an object array
$obj = new stdClass();
$obj->a = '1';
$obj->b = '2';
$obj->c = '3';
$obj->d = '4';

print_r($a);echo '
'
; print_r($obj);echo '
'
; //converting object array to array $b = (array) $obj; print_r($b);echo '
'
; //converting array to object $c = (object) $a; print_r($c);echo '
'
; ?>

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

answer

0

Chuyển mảng thành object php

Tôi sử dụng cách sau đây để phân tích các mảng Yaml liên kết thành một trạng thái đối tượng.

Điều này kiểm tra tất cả các mảng được cung cấp nếu có các đối tượng ẩn ở đó và cũng biến chúng trong các đối tượng.

    /**
     * Makes a config object from an array, making the first level keys properties a new object.
     * Property values are converted to camelCase and are not set if one already exists.
     * @param array $configArray Config array.
     * @param boolean $strict To return an empty object if $configArray is not an array
     * @return stdObject The config object
     */
    public function makeConfigFromArray($configArray = [],$strict = true)
    {
        $object = new stdClass();

        if (!is_array($configArray)) {
            if(!$strict && !is_null($configArray)) {
                return $configArray;
            }
            return $object;
        }

        foreach ($configArray as $name => $value) {
            $_name = camel_case($name);
            if(is_array($value)) {
                $makeobject = true;
                foreach($value as $key => $val) {
                    if(is_numeric(substr($key,0,1))) {
                        $makeobject = false;
                    }
                    if(is_array($val)) {
                        $value[$key] = $this->makeConfigFromArray($val,false);
                    }
                }
                if($makeobject) {
                    $object->{$name} = $object->{$_name} = $this->makeConfigFromArray($value,false);
                }
                else {
                    $object->{$name} = $object->{$_name} = $value;
                }

            }
            else {
                $object->{$name} = $object->{$_name} = $value;
            }
        }

        return $object;
    }

Điều này biến một yaml được cấu hình là

fields:
    abc:
        type: formfield
        something:
            - a
            - b
            - c
            - d:
                foo: 
                   bar

đến một mảng bao gồm:

array:1 [
  "fields" => array:1 [
    "abc" => array:2 [
      "type" => "formfield"
      "something" => array:4 [
        0 => "a"
        1 => "b"
        2 => "c"
        3 => array:1 [
          "d" => array:1 [
            "foo" => "bar"
          ]
        ]
      ]
    ]
  ]
]

đến một đối tượng của:

{#325
  +"fields": {#326
    +"abc": {#324
      +"type": "formfield"
      +"something": array:4 [
        0 => "a"
        1 => "b"
        2 => "c"
        3 => {#328
          +"d": {#327
            +"foo": "bar"
          }
        }
      ]
    }
  }
}

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