首頁  >  文章  >  後端開發  >  我們如何有效地將 PHP 陣列的 var_dump 輸出轉換回可用的陣列變數?

我們如何有效地將 PHP 陣列的 var_dump 輸出轉換回可用的陣列變數?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-27 01:46:02570瀏覽

How can we effectively convert a PHP array's var_dump output back into a usable array variable?

將陣列的var_dump 轉換回陣列變數

從簡介數組它的var_dump 輸出可能是一項艱鉅的任務。本文探討了在 PHP 中解決這項挑戰的創意方法。

挑戰描述

給定一個包含多維元素的數組,目標是建構一個可重複使用的函數來重新轉換var_dump 輸出返回 PHP 數組變數中。此函數應該要有效率並能處理複雜的陣列結構。

樸素方法

嘗試使用正規表示式反轉 var_dump 輸出可能不是最佳選擇。解析和重新組裝複雜的語法很容易出錯。

最佳化解決方案

一種創造性的方法是將var_dump 輸出轉換為序列化,而不是僅僅依賴正則表達式字串,然後反序列化它。這有效地重新建立了數組結構。

實現

以下代碼定義了實現上述策略的unvar_dump 函數:

使用示例
<code class="php">function unvar_dump($str) {
    // Convert output to newline-separated format
    if (strpos($str, "\n") === false) {
        $str = preg_replace(['#(\[.*?\]=>)#', '#(string\(|int\(|float\(|array\(|NULL|object\(|})#'], "\n\1", $str);
        $str = trim($str);
    }
    
    // Perform regex-based replacements to prepare for serialization
    $regex = [
        '#^\040*NULL\040*$#m',
        '#^\s*array\((.*?)\)\s*{\s*$#m',
        '#^\s*string\((.*?)\)\s*(.*?)$#m',
        '#^\s*int\((.*?)\)\s*$#m',
        '#^\s*bool\(true\)\s*$#m',
        '#^\s*bool\(false\)\s*$#m',
        '#^\s*float\((.*?)\)\s*$#m',
        '#^\s*\[(\d+)\]\s*=>\s*$#m',
        '#\s*?\r?\n\s*#m',
    ];
    $replace = [
        'N',
        'a:\1:{',
        's:\1:\2',
        'i:\1',
        'b:1',
        'b:0',
        'd:\1',
        'i:\1',
        ';'
    ];
    $serialized = preg_replace($regex, $replace, $str);
    
    // Handle object and custom string keys using callback functions
    $func = create_function(
        '$match', 
        'return "s:".strlen($match[1]).":\"".$match[1]."\"";'
    );
    $serialized = preg_replace_callback(
        '#\s*\["(.*?)"\]\s*=>#', 
        $func,
        $serialized
    );
    $func = create_function(
        '$match', 
        'return "O:".strlen($match[1]).":\"".$match[1]."\":".$match[2].":{";'
    );
    $serialized = preg_replace_callback(
        '#object\((.*?)\).*?\((\d+)\)\s*{\s*;#', 
        $func, 
        $serialized
    );
    
    $serialized = preg_replace(
        array('#};#', '#{;#'), 
        array('}', '{'), 
        $serialized
    );

    // Unserialize the modified string to reconstruct the array
    return unserialize($serialized);
}</code>

要使用此函數,只需提供陣列的var_dump 輸出作為輸入參數即可。該函數將傳回原始數組。

例如,給定以下 var_dump 輸出:

unvar_dump 函數將傳回原始陣列結構:

array(4) {
  ["foo"]=>
  string(8) "Foo"bar""
  [0]=>
  int(4)
  [5]=>
  float(43.2)
  ["af"]=>
  array(3) {
    [0]=>
    string(3) "123"
    [1]=>
    object(stdClass)#2 (2) {
      ["bar"]=>
      string(4) "bart"
      ["foo"]=>
      array(1) {
        [0]=>
        string(2) "re"
      }
    }
    [2]=>
    NULL
  }
}

以上是我們如何有效地將 PHP 陣列的 var_dump 輸出轉換回可用的陣列變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn