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

Mary-Kate Olsen
Lepaskan: 2024-10-27 01:46:02
asal
569 orang telah melayarinya

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>
Salin selepas log masuk

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
  }
}
Salin selepas log masuk

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
  )
)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!