如何检查数组是否采用特定格式

时间:2010-12-05 17:38:03

标签: php arrays

有没有办法检查数组是否采用以下格式:

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

而不是:

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

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

首先,你在第二个语句中有错误。我想你想写

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

所以条件是: 1.是assosiative数组 2.值不是数组

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

此功能会传递您的所有示例。

@Reese Moore当你测试这样的数组时你的函数返回无效值:

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

答案 2 :(得分:0)

如果数组不是太大并且元素中始终具有相同的模式结构,则可以对其进行序列化并使用regex-pattern进行检查。

优点:代码执行相当快,而且相对更干净,更智能。 缺点:当数组是多维的时候很难写正则表达式模式,更糟糕的是,当同一元素的值是不同类型时。 您必须在新版本的语言(PHP -> serialize)的版本中观察以序列化字符串格式所做的更改。

您可以为每个数组测试以下各种类型数组的示例......

示例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';
}

如果要组合上例中的类型,可以使用以下正则表达式:

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

示例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';
}

示例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';
}

......等等。