2010-12-05 8 views
0

Gibt es eine Möglichkeit zu überprüfen, ob ein Array im folgende Format ist:Wie zu überprüfen, ob ein Array in einem bestimmten Format ist

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

Und nicht:

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

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

Und was ist das Format, das Sie suchen? – codaddict

+0

@codaddict die erste – Ryan

+1

Ich denke, Sie müssen das Format ein wenig deutlicher angeben. Muss das Array beispielsweise genau zwei Zeichenfolgenschlüssel enthalten (Schlüssel, die nicht als Zahlen interpretiert werden können), die jeweils einen Zeichenfolgenwert enthalten sollen? – Mike

Antwort

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

die Bedingung wird nicht übereinstimmen ist '$ val [$ i]' ist numerisch – ajreal

+1

Ja, das ist eine Frage. Im Beispiel wird angegeben, dass das Format eine Zeichenfolge einer Zeichenfolge zuordnet. –

+0

Falls notwendig, kann für einen weniger strengen Test '! Is_string ($ val [$ i])' in 'is_array ($ val [$ i])' geändert werden. – Mike

1

Erste von allem haben Sie einen Fehler in der zweiten Aussage. Ich glaube, Sie

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

So Bedingungen schreiben wollte: 1. ist assoziatives Array 2. Wert kein Array

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

Diese Funktion übergibt alle Beispiele.

@Reese Moore Ihre Funktion Rückkehr ungültigen Wert, wenn Sie Array wie folgt testen:

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

Wenn das Array nicht zu groß ist und immer gleich Musterstruktur in seiner Elemente hat, können Sie es serialisiert werden konnte und es überprüfen mit Regex-Muster.

Vorteil: die Ausführung des Codes ist ziemlich schnell und es ist relativ sauber und intelligent. Nachteil: schwer zu schreiben das Regex-Muster, wenn das Array mehrdimensional ist und noch schlimmer, wenn die Werte des gleichen Elements von verschiedenen Typen sind. Sie müssen nach Änderungen suchen, die im Format der serialisierten Zeichenfolge in der Version einer neuen Version der Sprache vorgenommen wurden.

Sie können die folgenden Beispiele für verschiedene Arten von Arrays testen für jeden von ihnen ...

Beispiel 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'; 
} 

Wenn Sie die Typen in dem obigen Beispiel kombinieren möchten Sie verwenden können, der folgende reguläre Ausdruck:

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

Beispiel 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'; 
} 

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

Verwandte Themen