Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah kita boleh menukar output var_dump tatasusunan PHP dengan berkesan kepada pembolehubah tatasusunan yang boleh digunakan?

Bagaimanakah kita boleh menukar output var_dump tatasusunan PHP dengan berkesan kepada pembolehubah tatasusunan yang boleh digunakan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-27 01:46:02570semak imbas

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

Menukar var_dump Tatasusunan Kembali kepada Pembolehubah Tatasusunan

Pengenalan

Mendapatkan semula tatasusunan asal daripada output var_dumpnya boleh menjadi tugas yang sukar. Artikel ini meneroka kaedah kreatif untuk menangani cabaran ini dalam PHP.

Penerangan Cabaran

Memandangkan tatasusunan dengan unsur berbilang dimensi, matlamatnya adalah untuk membina fungsi boleh guna semula yang menukar semula var_dump output kembali ke pembolehubah tatasusunan PHP. Fungsi ini harus cekap dan mengendalikan struktur tatasusunan yang kompleks.

Pendekatan Naif

Percubaan untuk membalikkan output var_dump menggunakan ungkapan biasa mungkin tidak optimum. Menghuraikan dan menyusun semula sintaks kompleks terdedah kepada ralat.

Penyelesaian Dioptimumkan

Daripada bergantung semata-mata pada ungkapan biasa, pendekatan kreatif melibatkan penukaran output var_dump menjadi bersiri rentetan dan kemudian menyahsirinya. Ini secara berkesan mencipta semula struktur tatasusunan.

Pelaksanaan

Kod berikut mentakrifkan fungsi unvar_dump yang melaksanakan strategi di atas:

<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>

Contoh Penggunaan

Untuk menggunakan fungsi ini, hanya sediakan output var_dump tatasusunan sebagai parameter input. Fungsi ini akan mengembalikan tatasusunan asal.

Sebagai contoh, memandangkan output var_dump berikut:

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
  }
}

Fungsi unvar_dump akan mengembalikan struktur tatasusunan asal:

array(
  "foo" => "Foo"bar"",
  0 => 4,
  5 => 43.2,
  "af" => array(
    0 => "123",
    1 => (object) [
      "bar" => "bart",
      "foo" => array(
        0 => "re"
      )
    ],
    2 => null
  )
)

Atas ialah kandungan terperinci Bagaimanakah kita boleh menukar output var_dump tatasusunan PHP dengan berkesan kepada pembolehubah tatasusunan yang boleh digunakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn