2017-04-20 154 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对象或创建新的列来存储这些数据..