PHP~如何测试完全关联的数组

时间:2011-01-09 17:07:32

标签: php arrays associative-array

有许多 - 好的和不太好的 - 检查关联数组的方法,但是你如何检查“完全关联”的数组呢?

$john = array('name' => 'john', , 8 => 'eight', 'children' => array('fred', 'jane'));
$mary1 = array('name' => 'mary', 0 => 'zero', 'children' => array('jane'));
$mary2 = array('name' => 'mary', 'zero', 'children' => array('jane'));

这里$ john是完全关联的,$ mary1和$ mary2不是。

2 个答案:

答案 0 :(得分:2)

为了缩短它,你不能因为每个数组都以相同的方式实现。来自docs

  

PHP中的数组实际上是有序地图。映射是将值与键关联的类型。

如果对实现没有任何见解,但我很确定array(1,2,3)只是array(0=>1, 1=>2, 2=>3)的简写,即最终它完全相同。你无法区分它。

您只能假设通过array(value, value,...)创建的数组具有0的索引,而其他数组则没有。但是你已经看到,情况并非总是如此。

每次尝试检测“关联”数组都会在某些时候失败。

实际问题是:为什么你需要这个吗?

答案 1 :(得分:1)

这是你要找的吗?

<?php
function is_assoc( $array ) {
    if( !is_array( $array ) || array_keys( $array ) == range( 0, count( $array ) - 1 ) ) {
        return( false );
    }
    foreach( $array as $value ) {
        if( is_array( $value ) && !is_assoc( $value ) ) {
            return( false );
        }
    }
    return( true );
}
?>

检测取决于您对关联的定义。此函数检查关联,这意味着没有顺序数字键的数组。有人可能会说,关联是隐式设置密钥而不是由php计算的任何东西。其他人甚至可能将所有PHP数组定义为关联的(在这种情况下is_array()就足够了)。同样,这一切都取决于,但这是我在我的项目中使用的功能。希望这对你来说已经足够了。