2010-12-05 7 views
0

Est-il possible de vérifier si un tableau est dans le format suivant:Comment vérifier si un tableau est dans un format spécifique

array('foo'=>'bar','year'=>'2011'); 

Et pas:

array('php','code','computer'); 

array('foo'=>('foo'=>'bar'),'php'=>('something'=>'perl')) 
+0

Et quel est le format que vous cherchez? – codaddict

+0

@codaddict le premier – Ryan

+1

Je pense que vous devez spécifier le format un peu plus clairement. Par exemple, le tableau doit-il contenir exactement deux clés de chaîne (clés qui ne peuvent pas être interprétées comme des nombres), dont chacune doit contenir une valeur de chaîne? – Mike

Répondre

3
function isArrayInFormat($array) 
{ 
    $key = array_keys($array); 
    $val = array_values($array); 
    $count = count($array); 

    for ($i = 0; $i < $count; $i++) 
    { 
     if (!is_string($key[$i]) || !is_string($val[$i])) 
     { 
      return false; 
     } 
    } 

    return true; 
} 
+2

la condition ne correspondra pas est '$ val [$ i]' est numérique – ajreal

+1

Oui, c'est un peu le point. L'exemple indique que le format associe une chaîne à une chaîne. –

+0

Si nécessaire, pour un test moins strict, '! Is_string ($ val [$ i])' pourrait être changé en 'is_array ($ val [$ i])'. – Mike

1

Première de tout ce que vous avez une erreur dans la deuxième déclaration. Je pense que vous vouliez écrire

array('foo' => array('foo'=>'bar'),'php' => array('something'=>'perl')); 

Donc les conditions sont les suivantes: 1. est un tableau assosiative 2. valeur est pas un tableau

function isAssocAndFlat(array $array) { 
    // first we check if array is associatvie 
    $keys = array_keys($array); 

    // If the array keys of the keys match the keys, then the array must 
    // not be associative (e.g. the keys array looked like {0:0, 1:1...}). 
    if (array_keys($keys) !== $keys) { 
     foreach ($array as $key => $value) { 
      if (is_array($value)) { 
       return false; 
      } 
     } 
     return true; 
    } 
    return false; 
} 

Cette fonction passe tous vos exemples.

@Reese Moore votre déclaration de fonction valeur non valide lorsque vous tableau test comme ceci:

$test = array('first' => 'value1', '2' => 'value2'); 
0

Si le tableau est pas trop grand et a toujours la structure égale de modèle dans ses éléments, vous pourriez sérialiser et le vérifier avec motif regex. Avantage: l'exécution du code est assez rapide et relativement plus propre et intelligente. Inconvénient: difficile d'écrire le motif regex lorsque le tableau est multidimensionnel et pire, lorsque les valeurs d'un même élément sont de types différents. Vous devez surveiller les modifications apportées au format de la chaîne sérialisée dans la version d'une nouvelle version du langage (PHP -> serialize).

Vous pouvez tester les exemples suivants de différents types de tableaux pour chacun d'entre eux ...

Exemple 1:

$arr_1 = array(1,22,333,);  //-> a:3:{i:0;i:1;i:1;i:22;i:2;i:333;} 
// $arr_1 = array(1,22,'333',); //-> a:3:{i:0;i:1;i:1;i:22;i:2;s:3:"333";} 

if (is_array($arr_1) && 
    preg_match('/^a:\d+:{(i:\d+;)+}$/', serialize($arr_1)) 
) { 
    echo 'TRUE'; 
} else { 
    echo 'FALSE'; 
} 

Si vous souhaitez combiner les types dans l'exemple ci-dessus, vous pouvez utiliser l'expression régulière suivante:

preg_match('/^a:\d+:{((i:\d+;)|(i:\d+;s:\d+:\"\w+\";))+}$/', serialize($arr_1)) 

Exemple 2:

$arr_2 = array('a', 'bb', 'ccccc',); //-> a:3:{i:0;s:1:"a";i:1;s:2:"bb";i:2;s:5:"ccccc";} 
// $arr_2 = array('a', 'bb', 7,); //-> a:3:{i:0;s:1:"a";i:1;s:2:"bb";i:2;i:7;} 

if (is_array($arr_2) && 
    preg_match('/^a:\d+:{(i:\d+;s:\d+:\"\w+\";)+}$/', serialize($arr_2)) 
) { 
    echo 'TRUE'; 
} else { 
    echo 'FALSE'; 
} 

Exemple 3:

$arr_3 = array(
    array('name'=>'War and Peace', 'year'=>1865), 
    array('name'=>'Different Seasons', 'year'=>1982), 
); // exit(serialize($arr_3)); 
// $arr_3 = array(
// array('name'=>'War and Peace', 'year'=>1865), 
// array('name'=>'Different Seasons', 'year'=>'1982'), 
//); // exit(serialize($arr_3)); 

if (is_array($arr_3) && 
    preg_match('/^a:\d+:{(i:\d+;a:\d+:{s:\d+:\"name\";s:\d+:\"[\w+\s+]+\";s:\d+:\"year\";i:\d{4};})+}$/', serialize($arr_3)) 
) { 
    echo 'TRUE'; 
} else { 
    echo 'FALSE'; 
} 

... etc.

Questions connexes