PHP 將 Object 轉換成 Array (CLI JSON Reader)

要在 Command line 讀取 JSON, 一時找不到可以直接讀取的 Library, 所以就先用 PHP 寫一個來頂.

物件轉換成陣列使用的函式

PHP 使用 json_decode 預設是會回傳物件, 但是物件拿來作 foreach 的處理有點麻煩, 所以需要 Object to Array 的轉換程式.

CLI 的 JSON Reader PHP 版程式

讀取 CLI 參數, 可用 fgets(STDIN);fgets(fopen('php://stdin', 'r')); 來抓取.


<?php
// json_file content:
//   {"version":1.0,"url":"http://tw.yahoo.com"}
// Usage:
//   cat json_file | php read_json.php

$stdin = get_object_vars(json_decode(fgets(STDIN)));
foreach ($stdin as $k => $v) {
    echo "$k = \"$v\"\n"; // print json_decode key => value.
}
?>

但是這個是 JSON 只有一層物件的狀況, 那多層物件的狀況, get_object_vars() 就不太夠用.

於此篇文章 [RESOLVED] foreach stdclass query 有寫好的 Function 可解決此狀況:


<?php
function std_class_object_to_array($stdclassobject)
{
    $_array = is_object($stdclassobject) ? get_object_vars($stdclassobject) : $stdclassobject;

    foreach ($_array as $key => $value) {
        $value = (is_array($value) || is_object($value)) ? std_class_object_to_array($value) : $value;
        $array[$key] = $value;
    }

    return $array;
}
// print_r(std_class_object_to_array(json_decode($json_str)));
?>

上述 PHP JSON Reader 的程式, 就只需要將 get_object_vars() 換成 std_class_object_to_array() 即可.

另外, 上述的程式看看就好, 不需要去用. XD

註: 感謝小海提醒: json_decode() 第二個參數帶 true, 就會回傳 Array, 而不會回傳物件. XD

因為 CLI 早就有 Perl 版本的程式可以用: json_xs - JSON::XS commandline utility

json_xs 安裝

  • apt-get install libjson-xs-perl

json_xs 使用

  1. $ json_xs -f json # 輸入下面這段 json code
  2. {"version":1.0,"url":"http://tw.yahoo.com"}
  3. ^D (Ctrl + D, 下面就是輸出結果)
  4. {
       "version" : 1,
       "url" : "http://tw.yahoo.com"
    }

json_xs 除了 json 外, 還可以吃 clzf / yaml ... 等格式. 🙂


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming。將永久鏈結加入書籤。

PHP 將 Object 轉換成 Array (CLI JSON Reader) 有 6 則回應

  1. 小海 說道:

    話說 json_decode 的第二個參數, 丟 true, 就可以回傳 array 了

  2. Tsung 說道:

    阿阿阿, 我.... 沒注意到這個... XDDDDD
    感謝提醒~ Orz..

  3. carol 說道:

    $arr = (array) $stdClassInstance;

  4. Tsung 說道:

    我剛剛測試, print_r() 的結果: [channel] => SimpleXMLElement Object.
    還是 Object 耶.

  5. Benson 說道:

    改天有空來試一下看看

發表迴響