Maison  >  Article  >  développement back-end  >  Comment reconstruire efficacement un tableau PHP à partir de sa sortie var_dump, étant donné l'absence de solution native en PHP ?

Comment reconstruire efficacement un tableau PHP à partir de sa sortie var_dump, étant donné l'absence de solution native en PHP ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-29 22:47:29661parcourir

How can you effectively reconstruct a PHP array from its var_dump output, given the lack of a native solution in PHP?

Récupération des structures de tableau à partir de la sortie var_dump

Introduction :

Souvent négligé, il existe un défi en PHP où l'on peut rencontrer le besoin de reconstruire un tableau à partir de sa sortie var_dump. Cette tâche apparemment simple ne dispose pas d'une solution native en PHP et a suscité la créativité des développeurs.

Énoncé du problème :

Étant donné un tableau, quelle que soit sa dimensionnalité, affiche son var_dump représentation :

<code class="php">$data = array('this' => array('is' => 'the'), 'challenge' => array('for' => array('you')));

$var_dump_output = array(2) 
{
    ["this"]=> array(1) ["is"]=> string(3) "the"
    ["challenge"]=> array(1) ["for"]=> array(1) [0]=> string(3) "you"
}</code>

Le défi est de concevoir une méthode optimisée pour reconvertir cette représentation var_dump en un tableau PHP utilisable.

Solution :

Bien que la sérialisation et var_export offrent des solutions valables, ce défi recherche des approches créatives et efficaces. Une de ces approches consiste à convertir la sortie var_dump en une chaîne sérialisée, puis à la désérialiser.

<code class="php">function unvar_dump($str) {
    // Add new lines for improved readability
    if (strpos($str, "\n") === false) {
        $str = preg_replace(['#(\[.*?\]=>)#', '#(string\(|int\(|float\(|array\(|NULL|object\(|})#'], "\n\1", $str);
        $str = trim($str);
    }

    // Regular expressions for pattern matching
    $regex = array(
        '#^\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 = array(
        'N',
        'a:\1:{',
        's:\1:\2',
        'i:\1',
        'b:1',
        'b:0',
        'd:\1',
        'i:\1',
        ';'
    );

    // Convert to serialized string
    $serialized = preg_replace($regex, $replace, $str);

    // Handle string keys
    $func = create_function('$match', 'return "s:".strlen($match[1]).":\"".$match[1]."\"";');
    $serialized = preg_replace_callback('#\s*\["(.*?)"\]\s*=>#', $func, $serialized);

    // Handle objects
    $func = create_function('$match', 'return "O:".strlen($match[1]).":\"".$match[1]."\":".$match[2].":{";');
    $serialized = preg_replace_callback('#object\((.*?)\).*?\((\d+)\)\s*{\s*;#', $func, $serialized);

    // Finalize serialized string
    $serialized = preg_replace(['#};#', '#{;#'], ['}', '{'], $serialized);

    // Unserialize and return the array
    return unserialize($serialized);
}</code>

Exemple d'utilisation :

<code class="php">$complex_array = array(
    "foo" => "Foo\"bar\"",
    0 => 4,
    5 => 43.2,
    "af" => array(
        0 => "123",
        1 => (object)[
            "bar" => "bart",
            "foo" => ["re"]
        ],
        2 => NULL
    )
);

$var_dump_output = var_export($complex_array, true);
$reconstructed_array = unvar_dump($var_dump_output);

// Verify if the reconstructed array matches the original
var_dump($complex_array === $reconstructed_array); // Outputs: bool(true)</code>

Cette solution fournit une solution pratique et méthode optimisée pour reconstruire des tableaux à partir de la sortie var_dump, présentant des approches alternatives de manipulation de données en PHP.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn