2009-10-14 41 views
5

Tôi đang cố gắng phân tích cú pháp dữ liệu dưới đây bằng cách sử dụng PHP. Một API trả về nó và tôi đã thử các cú pháp khác nhau. Làm cách nào để trả lại dữ liệu theo cách không đối tượng? Hoặc, cú pháp để gọi dữ liệu bằng cách sử dụng stdClass là gì?stdClass Vấn đề đối tượng

Tôi có thể chuyển đổi dữ liệu này thành một mảng dựa trên dữ liệu hay thậm chí là hai không? Tôi bị mất khi nói đến bộ dữ liệu dựa trên đối tượng.

stdClass Object 
(
    [0] => stdClass Object 
     (
      [district] => stdClass Object 
       (
        [state] => NY 
        [number] => 29 
       ) 

     ) 

    [1] => stdClass Object 
     (
      [district] => stdClass Object 
       (
        [state] => NY 
        [number] => 26 
       ) 

     ) 

) 

Khi tôi tạo ra các đối tượng trên của riêng tôi, và sau đó làm một var_dump, tôi có được điều này:

object(stdClass)#8 (2) { 
    [0]=> 
    object(stdClass)#4 (1) { 
    ["district"]=> 
    object(stdClass)#5 (2) { 
     ["state"]=> 
     string(2) "NY" 
     ["number"]=> 
     string(2) "29" 
    } 
    } 
    [1]=> 
    object(stdClass)#6 (1) { 
    ["district"]=> 
    object(stdClass)#7 (2) { 
     ["state"]=> 
     string(2) "NY" 
     ["number"]=> 
     string(2) "26" 
    } 
    } 
} 
+0

Đối tượng này bắt nguồn từ đâu? –

+0

Từ API này, http://emmense.com/sunlight-labs-php-library/ api_key = '[api key]'; echo '

'; print_r($sf->districtsByZipCode(14485)); echo '
'; ?> – ader

Trả lời

14

Họ có lẽ đúc mảng các đối tượng trong mã của họ ($object = (object) $array). Điều này có lợi thế là nó sẽ được chuyển qua tham chiếu từ bây giờ (như mặc định với đối tượng) và bất lợi là đối tượng hoàn toàn vô dụng (thành viên không thể bắt đầu bằng số - xem regex in PHP's docs) cho đến khi bạn đưa nó trở lại (PHP cho phép một số điều rất bí ẩn):

$array = (array) $bogusObject; 
$array[0]->district->state === 'NY'; 
+0

Ah ha! Tôi đã có một vấn đề tương tự một lần với một người nào đó sử dụng các thẻ XML như 'ad-text' - tải nó vào một đối tượng SimpleXML và cố gắng truy cập' $ ad-> ad-text' không hoạt động. – ceejayoz

+0

Công trình này! Cảm ơn! – ader

+5

Trên thực tế không cần phải truyền tới một mảng ... có thể sử dụng $ object -> {0} -> district .... – null

4

tôi nhìn vào mã của họ bây giờ, và thật không may, họ đã không tiếp xúc với các tùy chọn trong lớp học của họ để bạn có thể yêu cầu các dữ liệu như là một cây mảng kết hợp vs một stdClass cây đối tượng.

Các "vấn đề" là tại dòng 96 trong class.sunlightlabs.php

return json_decode($data); 

Bạn có một vài lựa chọn.

  1. Chỉ cần sử dụng cú pháp stdClass.
  2. Chuyển đổi cây stdClass trở thành một mảng kết hợp một

# 1 trong hành động

// echo the state of the 2nd object in the result 
echo $result->{0}->district->state; 

# 2 trong hành động

$result = toArray($result); 

function toArray($data) 
{ 
    if (is_object($data)) 
    { 
    $data = get_object_vars($data); 
    } 
    return is_array($data) ? array_map(__FUNCTION__, $data) : $data; 
} 

Bạn cũng có thể làm việc với lớp học của họ trực tiếp qua một số ứng dụng sáng tạo của các mẫu, nhưng chúng sử dụng nhiều sublcasses đã làm phức tạp nó một chút, vì vậy tôi sẽ dính vào một trong hai giải pháp này.

+2

Nếu bạn có thể thay đổi json_decode ($ data); tới json_decode ($ data, TRUE); Sau đó, hàm sẽ trả về một mảng. – null

+0

cảm ơn đề xuất get_object_vars hoạt động, tuy nhiên, đề xuất json_decode ($ data, TRUE) là giải pháp tốt nhất cho vấn đề này. cảm ơn! –

+0

Đồng ý. json_decode ($ data, TRUE) đã hoạt động rất tốt! – Suman

1

Bạn có thể lặp qua các đối tượng như thế này:

foreach ($obj as $each) { 
    echo $each->district->state . ' - ' . $each->district->number . '<br />'; 
} 
+0

Điều này hoạt động, nhưng không phải là chính xác những gì tôi đang tìm kiếm. Cảm ơn bạn mặc dù. – ader

+0

Tôi rất vui vì nó đã giúp ích. Tôi đã không cố gắng khớp chính xác nhu cầu của bạn, mà là để giúp trả lời câu hỏi của bạn, "cú pháp để gọi dữ liệu bằng cách sử dụng stdClass là gì?" (cũng như để chứng minh rằng stdClass có thể lặp lại). – GZipp

10

Sử dụng:

$object->{'0'}->district->state 

Về cơ bản Bạn ngắn cắt gán một chuỗi cho một biến, sau đó sử dụng biến mà là đối tượng của bạn accessor.

$zero = "0"; 
$object->$zero; /* or */ $object->{$zero}; 
+0

Đây là một hack thực sự mát mẻ, cảm ơn @null! Đã lưu giấc ngủ của tôi;) –

0

Giải pháp này từ soulmerge chỉ làm việc tốt cho tôi:

$array = (array) $bogusObject; 
$array[0]->district->state === 'NY'; 

Cảm ơn rất nhiều !!

1

Người dùng 'không' đề xuất điều này trong các nhận xét, nhưng muốn đặt nó ở đây để nó không bị bỏ lỡ quá dễ dàng.

Tùy chọn tốt nhất là chuyển TRUE làm tham số thứ hai trong json_decode tức là json_decode ($ data, TRUE) làm cho nó trả về mảng kết hợp thay vì lớp. Vì vậy, nếu bạn có quyền truy cập vào mã nguồn - hãy thực hiện thay đổi đó.

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