2012-02-07 45 views
10

tôi có một mảng đa chiều:làm thế nào để chuyển đổi mảng đa chiều thành đối tượng trong php?

$image_path = array('sm'=>$sm,'lg'=>$lg,'secondary'=>$sec_image); 

phù thủy trông như thế này:

[_media_path:protected] => Array 
      (
       [main_thumb] => http://example.com/e4150.jpg 
       [main_large] => http://example.com/e4150.jpg 
       [secondary] => Array 
        (
         [0] => http://example.com/e4150.jpg 
         [1] => http://example.com/e4150.jpg 
         [2] => http://example.com/e9243.jpg 
         [3] => http://example.com/e9244.jpg 
        ) 

      ) 

và tôi muốn chuyển đổi nó thành một đối tượng và giữ lại những cái tên chủ chốt.

Bất kỳ ý tưởng nào?

Cảm ơn

chỉnh sửa: $obj = (object)$image_path; dường như không hoạt động. i cần một cách khác nhau của vòng lặp qua mảng và tạo ra một đối tượng

+0

bạn có thể cho chúng tôi ví dụ tốt hơn về những gì bạn muốn đối tượng trông như thế nào không? bạn có muốn biến các khóa thành các thuộc tính không? cho mục đích gì bạn cần một đối tượng? – mpen

+0

thay vì sử dụng '[]' để lấy giá trị tôi cần sử dụng '->' – Patrioticcow

Trả lời

71

Một cách nhanh chóng để làm điều này là:

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

Giải thích

json_encode($array) sẽ chuyển đổi toàn bộ mảng đa chiều để một chuỗi JSON. (php.net/json_encode)

json_decode($string) sẽ chuyển chuỗi JSON thành đối tượng stdClass. Nếu bạn vượt qua trong TRUE làm đối số thứ hai cho json_decode, bạn sẽ nhận được một mảng kết hợp. (php.net/json_decode)

Tôi không nghĩ rằng hiệu suất ở đây so với đệ quy đi qua mảng và chuyển đổi mọi thứ là rất đáng chú ý, mặc dù tôi muốn xem một số điểm chuẩn này. Nó hoạt động, và nó sẽ không biến mất.

+2

Đây là câu trả lời, vì OP muốn toàn bộ mảng đa chiều chứ không phải mảng cấp cao nhất. – AeroCross

+1

Tôi sẽ nói rằng đây là một cách chậm để làm điều đó.Nếu hiệu suất là một mối quan tâm, tôi sẽ tránh giải pháp này. –

+0

@CalebTaylor - Tôi nghe ya. Tôi không chắc chắn về các tiêu chuẩn, nhưng tôi tò mò nếu có một sự khác biệt không tầm thường giữa đệ quy lặp qua một mảng đa chiều và thêm vào một đối tượng (tức là làm toàn bộ điều này bằng tay) hoặc đơn giản là chạy thủ thuật JSON ở trên . –

6

Cách tốt nhất là để quản lý cấu trúc dữ liệu của bạn như là một đối tượng ngay từ đầu nếu bạn có khả năng:

$a = (object) array(...); $a->prop = $value; //and so on 

Nhưng cách nhanh nhất sẽ là phương pháp được cung cấp bởi @CharlieS, sử dụng json_decode(json_encode($a)).

Bạn cũng có thể chạy mảng thông qua hàm đệ quy để thực hiện tương tự. Tôi chưa chấm điểm điều này theo cách tiếp cận json nhưng:

function convert_array_to_obj_recursive($a) { 
    if (is_array($a)) { 
     foreach($a as $k => $v) { 
      if (is_integer($k)) { 
       // only need this if you want to keep the array indexes separate 
       // from the object notation: eg. $o->{1} 
       $a['index'][$k] = convert_array_to_obj_recursive($v); 
      } 
      else { 
       $a[$k] = convert_array_to_obj_recursive($v); 
      } 
     } 

     return (object) $a; 
    } 

    // else maintain the type of $a 
    return $a; 
} 

Hy vọng điều đó sẽ hữu ích.

EDIT: json_encode + json_decode sẽ tạo đối tượng như mong muốn. Tuy nhiên, nếu mảng là chỉ mục số hoặc hỗn hợp (ví dụ: array('a', 'b', 'foo'=>'bar')), bạn sẽ không thể tham chiếu các chỉ mục bằng ký hiệu đối tượng (ví dụ: $ o-> 1 hoặc $ o [1]). hàm trên đặt tất cả các chỉ mục số vào thuộc tính 'index', chính nó là mảng số. vì vậy, bạn sẽ có thể thực hiện $o->index[1]. Điều này giữ cho sự phân biệt của một mảng được chuyển đổi từ một đối tượng đã tạo và để lại tùy chọn kết hợp các đối tượng có thể có các thuộc tính số.

+0

Cảm ơn bạn đã cung cấp chức năng đệ quy, tôi nghĩ điều đó có thể hữu ích đối với nhiều người đang vấp phải điều này. Tôi sẽ kiểm tra mã nguồn PHP để xem cách json_encode/decode so sánh về hiệu suất như thế nào. Tôi tò mò. –

+1

Bạn có thể tham khảo các thuộc tính số trên các đối tượng thông qua '$ o -> {1}'. –

Các vấn đề liên quan