Maison  >  Article  >  développement back-end  >  Comment pouvons-nous reconvertir efficacement la sortie var_dump d'un tableau PHP en une variable de tableau utilisable ?

Comment pouvons-nous reconvertir efficacement la sortie var_dump d'un tableau PHP en une variable de tableau utilisable ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-27 01:46:02570parcourir

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

Conversion de var_dump du tableau en variable de tableau

Introduction

Récupération du tableau d'origine de sa sortie var_dump peut être une tâche ardue. Cet article explore des méthodes créatives pour relever ce défi au sein de PHP.

Description du défi

Étant donné un tableau avec des éléments multidimensionnels, l'objectif est de construire une fonction réutilisable qui reconvertit le var_dump renvoie une variable de tableau PHP. Cette fonction doit être efficace et gérer des structures de tableaux complexes.

Approche naïve

Tenter d'inverser la sortie var_dump à l'aide d'expressions régulières n'est peut-être pas optimal. L'analyse et le réassemblage de la syntaxe complexe sont sensibles aux erreurs.

Solution optimisée

Au lieu de s'appuyer uniquement sur des expressions régulières, une approche créative consiste à convertir la sortie var_dump en un fichier sérialisé. chaîne, puis en la désérialisant. Cela recrée efficacement la structure du tableau.

Implémentation

Le code suivant définit la fonction unvar_dump qui implémente la stratégie ci-dessus :

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

Exemple d'utilisation

Pour utiliser cette fonction, fournissez simplement la sortie var_dump d'un tableau comme paramètre d'entrée. La fonction renverra le tableau d'origine.

Par exemple, étant donné la sortie var_dump suivante :

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

La fonction unvar_dump renverrait la structure de tableau d'origine :

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

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