Kinh Nghiệm về Chuyển mảng thành object php Chi Tiết
Khoa Minh Hoàng đang tìm kiếm từ khóa Chuyển mảng thành object php được Update vào lúc : 2022-09-30 05:54:21 . Với phương châm chia sẻ Mẹo Hướng dẫn trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi Read Post vẫn ko hiểu thì hoàn toàn có thể lại Comments ở cuối bài để Ad lý giải và hướng dẫn lại nha.answer
Nội dung chính- Kiểm tra 1: Mảng phẳngKiểm tra 2: Mảng đối tượngBài kiểm tra 3: Đối tượng
15

Cái này thao tá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. Meta's horizontal scrollbars showing up on a 1024x768 screen resolution. ) [129] => stdClass Object ( [status] => The other day work, I had some spare time )như thường lệ, bạn hoàn toàn có thể lặp nó như sau:
foreach($myobject as $obj) echo $obj->status;15 hữu ích 2 phản hồi chia sẻ
answer
477

Trong trường hợp đơn giản nhất, có lẽ rằng đủ để "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 những 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 những json_chức năng tích hợp:
$object = json_decode(json_encode($array), FALSE);Điều này cũng (đệ quy) quy đổi tất cả những mảng con của bạn thành những đối tượng mà bạn hoàn toàn có thể muốn hoặc không thích. Thật rủi ro, 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 đã phản hồi):
json_decode trên những môi trường tự nhiên thiên nhiên rất khác nhau quy đổi tài liệu UTF-8 theo những phương pháp rất khác nhau. Cuối cùng, tôi nhận được những 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 quy đổi không thành công, chuỗi được trả về là NULL
477 hữu ích 5 phản hồi chia sẻ
answer
146

bạn chỉ hoàn toàn có thể sử dụng kiểu truyền để quy đổ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 phản hồi 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 và sinh hoạt giải trí.
93 hữu ích 5 phản hồi chia sẻ
answer
93

Dưới đây là ba cách:
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;Chuyển đổi mảng thành một đối tượng bằng phương pháp chuyển nó thành một đối tượng:
$array = array( // ... ); $object = (object) $array;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 phản hồi chia sẻ
answer
83

Cách thuận tiện và đơn giản sẽ là
$object = (object)$array;Nhưng đó không phải là vấn đề bạn muốn. Nếu bạn muốn những đối tượng bạn muốn đạt được một chiếc gì đó, nhưng điều đó bị thiếu trong thắc mắc này. Sử dụng những đối tượng chỉ vì nguyên do sử dụng những đối tượng không còn ý nghĩa.
83 hữu ích 5 phản hồi chia sẻ
answer
29

Cách đơn giản, Điều này cũng tiếp tục tạo một đối tượng cho những mảng đệ quy:
$object = json_decode(json_encode((object) $yourArray), FALSE);29 hữu ích 2 phản hồi 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 thức rất khác nhau để làm điều đó.
Ví dụ: chỉ việc 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 nhờ vào một chuỗi xác định loại (hoặc bằng phương pháp 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 === NULLVí 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 phản hồi 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 hoàn toàn có thể lý giải về điều đó nếu bạn cần nó để xây dựng đối tượng của tớ một cách đệ quy.
15 hữu ích 0 phản hồi chia sẻ
answer
8

Trên thực tế nếu bạn muốn sử dụng điều này với những mảng đa chiều, bạn sẽ muốn sử dụng một số trong những đệ 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 phản hồi chia sẻ
answer
6

Tôi chắc như đinh sẽ đi với một cách sạch sẽ như vậy này:
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:

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 những câu vấn đáp trên từ những Đối tượng nên được sử dụng cho mục tiêu mà chúng được tạo ra (đóng gói những đối tượng nhỏ dễ thương).
Ngoài ra, sử dụng get_object_vars đảm nói rằng không còn thuộc tính tương hỗ update nào được tạo trong Đối tượng bị thao túng (bạn không thích một chiếc xe mang tên mái ấm gia đình cũng như một người cư xử với 4 bánh xe).
6 hữu ích 1 phản hồi chia sẻ
answer
5

Bạn cũng hoàn toàn có thể sử dụng ArrayObject, ví dụ:
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 => 35 hữu ích 1 phản hồi 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 phản hồi 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 phản hồi 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 hoàn toàn 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 hoàn toà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 đồng ý. 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 như đinh rằng bạn có những trình biến hóa được định nghĩa trong lớp của bạn. Bây giờ bạn đã sẵn sàng để gọi những 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 phản hồi 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 phản hồi chia sẻ
answer
4

sử dụng hiệu suất cao 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 phản hồi 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 hoàn toà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 phản hồi chia sẻ
answer
2

Bạn cũng hoàn toàn có thể làm điều này bằng phương pháp thêm (đối tượng) bên trái biến để tạo một đối tượng mới.
" text" ); var_dump($a); $b = (object)$a; var_dump($b); var_dump($b->status);://codepad.org/9YmD1KsU
2 hữu ích 1 phản hồi chia sẻ
answer
2

Việc sử dụng json_encodelà có vấn đề vì cách nó xử lý tài liệu không phải UTF-8. Điều đáng để ý quan tâm là phương thức json_encode/ json_encodecũng để những mảng không link thành mảng. Điều này hoàn toàn có thể hoặc không thể là những gì bạn muốn. Gần đây tôi đã ở vị trí nên phải tạo lại hiệu suất cao của giải pháp này nhưng không sử dụng những 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 phản hồi chia sẻ
answer
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 những phương pháp rất 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 phản hồi chia sẻ
answer
2

lót
$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));2 hữu ích 1 phản hồi chia sẻ
answer
1

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 hoàn toàn có thể nên phải thay đổi những mảng trông ra làm sao để làm cho đối tượng trông in như bạn muốn.
://api.cakephp.org/view_source/set/#line-158
Trường hợp xấu nhất, bạn hoàn toàn có thể đã có được một vài ý tưởng từ hiệu suất cao này.
1 hữu ích 0 phản hồi chia sẻ
answer
1

Rõ ràng chỉ là phép ngoại suy một số trong những câu vấn đáp của một số trong những người dân khác, nhưng đây là hàm đệ quy sẽ quy đổ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ó những khóa số, chúng vẫn hoàn toàn có thể được tham chiếu trong đối tượng kết quả bằng phương pháp sử dụng (ví dụ $obj->prop->4->prop:)
1 hữu ích 0 phản hồi chia sẻ
answer
1

Lấy cảm hứng từ tất cả những mã này, tôi đã nỗ lực tạo một phiên bản nâng cao với sự tương hỗ: tên lớp rõ ràng, tránh phương thức hàm tạo, mẫu 'đậu' và chính sách nghiêm ngặt (chỉ đặt những 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 phản hồi chia sẻ
answer
1

Mã
Chức năng này hoạt động và sinh hoạt giải trí 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 phản hồi chia sẻ
answer
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;0 hữu ích 0 phản hồi chia sẻ
answer
0

0 hữu ích 0 phản hồi chia sẻ
answer
0

Bằng cách sử dụng (mảng) và (đối tượng) làm tiền tố, bạn chỉ việc quy đổi mảng đối tượng thành mảng tiêu chuẩn và ngược lại
'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 phản hồi chia sẻ
answer
0

Tôi sử dụng cách sau đây để phân tích những mảng Yaml link thành một trạng thái đối tượng.
Điều này kiểm tra tất cả những mảng được đáp ứng nếu có những đối tượng ẩn ở đó và cũng biến chúng trong những đố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 thông số kỹ thuật là
fields: abc: type: formfield something: - a - b - c - d: foo: barđến một mảng gồm có:
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 phản hồi chia sẻ
Tải thêm tài liệu liên quan đến nội dung bài viết Chuyển mảng thành object php programming php