有没有办法检查数组是否采用以下格式:
array('foo'=>'bar','year'=>'2011');
而不是:
array('php','code','computer');
array('foo'=>('foo'=>'bar'),'php'=>('something'=>'perl'))
答案 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';
}
......等等。