簡體   English   中英

如何將包含數組值的字符串轉換為PHP數組?

[英]How to convert a string containing an array value to a PHP array?

我有一個包含如下數組的字符串:

$tarray = Array ( [gt_ref_id] => 36493115 [tender_notice_type] => [organisation_name] => ROSALES WATER DISTRICT [address] => No. 5 Bonifacio Street [address2] => [contact_person] => [tender_notice_no] => ROSALWD 2016-011-0144(Ref: 4206661)
)

但我想像這樣訪問此數組的值:

echo "ref id = ".$tarray['gt_ref_id'];

它應該輸出如下:

ref id = 36493115

但我不能,因為它是一個字符串。 我可以,如果它是一個數組。

如何將字符串轉換為適當的PHP數組?

如果要在數據庫上存儲一個php數組,可以嘗試使用json_encodeserialize ,當需要從數據庫中檢索數據時,可以使用json_decodeunserialize

使用JSON

示例(存儲為json):

$myArray = array('name' => 'Jack', 'lastname' => 'Smith', 24);
$toStore = json_encode($myArray); // return a string: {"name":"Jack","lastname":"Smith","0":24}

mysqli_query($link,
    'INSERT INTO myTable (data)
    VALUES ("' . mysqli_real_escape_string($link, $toStore) . '")'
);

示例(從json中檢索):

$query = mysqli_query($link, 'SELECT FROM MyTable WHERE id = ...');
$row = mysqli_fetch_assoc($query);
$row = json_decode($row); // return a array: array('name' => 'Jack', 'lastname' => 'Smith', 24)

使用serialize

示例(商店序列化):$ myArray = array('name'=>'Jack','lastname'=>'Smith',24); $ toStore = serialize($ myArray); //返回一個字符串:a:3:{s:4:“ name”; s:4:“ Jack”; s:8:“ lastname”; s:5:“ Smith”; i:0; i:24 ;}

mysqli_query($link,
    'INSERT INTO myTable (data)
    VALUES ("' . mysqli_real_escape_string($link, $toStore) . '")'
);

示例(檢索序列化):

$query = mysqli_query($link, 'SELECT FROM MyTable WHERE id = ...');
$row = mysqli_fetch_assoc($query);
$row = unserialize($row); // return a array: array('name' => 'Jack', 'lastname' => 'Smith', 24)

之后:

如果您需要從轉換后的數組訪問數據,則可以這樣調用:

$row['name'] // return "Jack"

另一種方式

正則表達式:

您可以嘗試使用regexp,但這不是最好的方法,因為有時處理數據的速度太慢,而且也許,如果您不了解安全方面,那么絕對不是最佳方法。

分詞器:

您可以嘗試創建自己的令牌處理器,例如模板引擎,但這是最大的方法...

了解有關功能的更多信息:

優點:

  1. 支持多種數據類型:多維arrayobjectintegerfloatstring以及除resource以外的更多數據。
  2. 自PHP4以來,本機支持serialize和反unserialize
  3. 自PHP 5.2.0起對json_encodejson_decode機支持
  4. 快速,安全的編碼和解碼。

根據Olaf Erlandsen的建議,您可能應該以其他格式存儲數組-序列化或json轉儲。 我希望后者。

但是,很有可能您不是生成此(相當奇怪)字符串的人。 它可能由其他人提供。 在這種情況下,您可以使用正則表達式(RegEx)提取數組的鍵和值。

您可以使用preg_match_all()來匹配它們,然后循環匹配以將它們加入數組。 我發現設置PREG_SET_ORDER標志時更容易遍歷結果。

示例代碼:

$string = "Array ( [gt_ref_id] => 36493115 [tender_notice_type] => hiha [organisation_name] => ROSALES WATER DISTRICT [address] => No. 5 Bonifacio Street [address2] => [contact_person] => [tender_notice_no] => ROSALWD 2016-011-0144(Ref: 4206661))";
$string = substr( $string, 8 ); # Strip Array ( , from beginning of string.
$string = substr( $string, 0, - 1 ); # Strip last ) from string.

preg_match_all( "/\[(.*?)\] => ([^\[]*)/", $string, $matches, PREG_SET_ORDER );

foreach ( $matches as $match ) {
    $tarray[ $match[1] ] = substr( $match[2], 0, - 1 );
    # Note that $match[2] contains a trailing white-space, stripping it with substr().
    # On another note, you should probably check whether $match[2] has any content.
}

var_dump($tarray);

我將這種模式放在regex101上,如果您不熟悉這些模式 ,那可能會使事情變得更清楚。

注意:我並不是RegEx專家,也許有人可以檢查我提供的模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM