2017-04-20 108 views
1

我的團隊成員之一已將對象保存在Mysql數據庫中。我需要提取對象屬性值。當我試圖使用PHP從Mysql中獲取它時,我將其作爲字符串獲取。除了使用PHP substr()函數的想法之外,沒有直接訪問屬性的運氣。將print_r對象數組字符串轉換爲json的php

是否有任何選項將保存在數據庫中的下面的字符串再次轉換爲對象,以便我可以訪問它的屬性。

stdClass Object 
(
[status] => 0 
[environment] => Sandbox 
[receipt] => stdClass Object 
    (
     [quantity] => 1 
     [expires_date] => 2017-04-18 08:56:57 Etc/GMT 
     [is_trial_period] => false 
     [purchase_date] => 2017-04-18 08:51:57 Etc/GMT 
     [product_id] => com.1monthAuto.baseball 
     [original_purchase_date_pst] => 2017-04-18 01:51:58 America/Los_Angeles 
     [original_purchase_date_ms] => 1492505518000 
     [web_order_line_item_id] => 1000000034854560 
     [original_purchase_date] => 2017-04-18 08:51:58 Etc/GMT 
    ) 

[latest_receipt] => MIIT6wYJKoZIhvcNAQcCoIIT3DCCE9gC 
) 
+1

要訪問哪個屬性? –

+0

我想訪問'latest_receipt'。 –

+3

在數據庫中存儲對象聽起來像是一個可怕的設計模式,因爲它會導致這樣的問題。 – Qirel

回答

1

試試這個希望這會幫助你。

正則表達式:/latest_receipt\]\s*=>\s*\K[^\s\)]+/

latest_receipt\]\s*=>\s*這將匹配latest_receipt]空格=>空間

\K將復位以前匹配

[^\s\)]+這將匹配所有除空間(\s)和)

Try this code snippet here

<?php 

ini_set('display_errors', 1); 
$string='stdClass Object 
(
[status] => 0 
[environment] => Sandbox 
[receipt] => stdClass Object 
    (
     [quantity] => 1 
     [expires_date] => 2017-04-18 08:56:57 Etc/GMT 
     [is_trial_period] => false 
     [purchase_date] => 2017-04-18 08:51:57 Etc/GMT 
     [product_id] => com.1monthAuto.baseball 
     [original_purchase_date_pst] => 2017-04-18 01:51:58 America/Los_Angeles 
     [original_purchase_date_ms] => 1492505518000 
     [web_order_line_item_id] => 1000000034854560 
     [original_purchase_date] => 2017-04-18 08:51:58 Etc/GMT 
    ) 

[latest_receipt] => MIIT6wYJKoZIhvcNAQcCoIIT3DCCE9gC 
)'; 
preg_match("/latest_receipt\]\s*=>\s*\K[^\s\)]+/", $string,$matches); 
print_r($matches); 

解決方案2:or you can Try this library //這個解決方案將print_r轉換爲json,工作肯定。

Try this code snippet hereCopy paste below code and check

<?php 
ini_set('display_errors', 1); 
/** 
* @author Sahil Gulati <[email protected]> 
*/ 
echo printr_source_to_json(
     print_r(
       array("Name"=>"Sahil Gulati", 
         "Education"=>array(
          "From"=>array(
           "DU"=>array(
            "Course"=>"B.Sc. (Hons.) Computer Science.") 
          ) 
         ) 
        ) 
       , true 
       ) 
     ); 
/** 
* This function will convert output string of `print_r($array)` to `json string` 
* @note Exceptions are always there i tried myself best to get it done. Here $array can be array of arrays or arrays of objects or both 
* @param String $string This will contain the output of `print_r($array)` (which user will get from ctrl+u of browser), 
* @return String 
*/ 
function printr_source_to_json($string) 
{ 
    /** 
    *replacing `stdClass Objects (` to `{` 
    */ 
    $string = preg_replace("/stdClass Object\s*\(/s", '{ ', $string); 

    /** 
    *replacing `Array (` to `{` 
    */ 
    $string = preg_replace("/Array\s*\(/s", '{ ', $string); 
    /** 
    *replacing `)\n` to `},\n` 
    * @note This might append , at the last of string as well 
    * which we will trim later on. 
    */ 
    $string = preg_replace("/\)\n/", "},\n", $string); 

    /** 
    *replacing `)` to `}` at the last of string 
    */ 
    $string = preg_replace("/\)$/", '}', $string); 
    /** 
    *replacing `[ somevalue ]` to "somevalue" 
    */ 
    $string = preg_replace("/\[\s*([^\s\]]+)\s*\](?=\s*\=>)/", '"\1" ', $string); 
    /** 
    * replacing `=> {` to `: {` 
    */ 
    $string = preg_replace("/=>\s*{/", ': {', $string); 
    /** 
    * replacing empty last values of array special case `=> \n }` to : "" \n 
    */ 
    $string = preg_replace("/=>\s*[\n\s]*\}/s", ":\"\"\n}", $string); 

    /** 
    * replacing `=> somevalue` to `: "somevalue",` 
    */ 
    $string = preg_replace("/=>\s*([^\n\"]*)/", ':"\1",', $string); 
    /** 
    * replacing last mistakes `, }` to `}` 
    */ 
    $string = preg_replace("/,\s*}/s", '}', $string); 
    /** 
    * replacing `} ,` at the end to `}` 
    */ 
    return $string = preg_replace("/}\s*,$/s", '}', $string); 
} 
+0

+1這似乎是一個更好的想法來提取價值。是否有任何選項可用於使此字符串對象,以便我可以提取其他屬性值? –

+0

@ArJinJain讓我檢查這個以及.. –

+0

@ArJinJain我創建了一個新的解決方案,我要發佈希望它會幫助你出 –

0

使用正則表達式和str_replace函數有latest_receipt內容爲一個字符串:

$dictionary="stdClass Object 
    (
    [status] => 0 
    [environment] => Sandbox 
    [receipt] => stdClass Object 
     (
      [quantity] => 1 
      [expires_date] => 2017-04-18 08:56:57 Etc/GMT 
      [is_trial_period] => false 
      [purchase_date] => 2017-04-18 08:51:57 Etc/GMT 
      [product_id] => com.1monthAuto.baseball 
      [original_purchase_date_pst] => 2017-04-18 01:51:58 America/Los_Angeles 
      [original_purchase_date_ms] => 1492505518000 
      [web_order_line_item_id] => 1000000034854560 
      original_purchase_date] => 2017-04-18 08:51:58 Etc/GMT 
     ) 

    [latest_receipt] => MIIT6wYJKoZIhvcNAQcCoIIT3DCCE9gC 
    )"; 
preg_match('/.*\[latest_receipt\].*$/m', $dictionary, $matches); 
$receipt = str_replace('[latest_receipt] => ', '', $matches[0]); 
echo $receipt; 

你可以把它的功能,並具有可變提取更換latest_receipt你的其他數據。

但是你應該認真考慮把它作爲一個JSON對象或創建新的列來存儲這些數據..

相關問題