检查特定数组中是否存在关联键

时间:2013-10-08 21:49:54

标签: php arrays

我正在尝试构建一个函数来检查数组中特定位置是否有值:

function ($array, $key) {
  if (isset($array[$key]) {
    return true;
  }
  return false;
}

但是如何在多阵列中完成此操作?说我想检查$array[test1][test2]

上是否设置了值

5 个答案:

答案 0 :(得分:1)

传递一组键,然后递归到你沿途找到的物体:

function inThere($array, $keys)
{
    $key = $keys;  // if a single key was passed, use that
    $rest = array();

    // else grab the first key in the list
    if (is_array($keys))
    {
        $key = $keys[0];
        $rest = array_slice($keys, 1);
    }

    if (isset($array[$key]))
    {
        if (count($rest) > 0)
            return inThere($array[$key], $rest);
        else
            return true;
    }

    return false;
}

所以,对于:

$foo = array(   
  'bar' => array( 'baz' => 1 )
);

inThere($foo, 'bar');                 // == true
inThere($foo, array('bar'));          // == true
inThere($foo, array('bar', 'baz'));   // == true
inThere($foo, array('bar', 'bazX'));  // == false
inThere($foo, array('barX'));         // == false

答案 1 :(得分:0)

这是一种检查是否设置了多级哈希表的非递归方法。

// $array it the container you are testing.
// $keys is an array of keys that you want to check. [key1,key2...keyn]
function ($array, $keys) {
  // Is the first key set?
  if (isset($array[$key]) {
    // Set the test to the value of the first key.
    $test = $array[$key];
    for($i = 1; $i< count($keys); $i++){
      if (!isset($test[$keys[$i]]) {
        // The test doesn't have a matching key, return false
        return false;
      }
      // Set the test to the value of the current key.
      $test = $test[$keys[$i]];
    }
    // All keys are set, return true.
    return true;
  } else {
    // The first key doesn't exist, so exit.
    return false;
  }
}

答案 2 :(得分:0)

我出去了,但也许是这样。 $ keys应该是一个数组,即使是一个,但你可以改变代码来检查一个键数组或只有一个:

function array_key_isset($array, $keys) {                                                                                          
    foreach($keys as $key) {
        if(!isset($array[$key])) return false;                                                          
        $array = $array[$key];
    }
    return true;
}
array_key_isset($array, array('test1','test2'));

答案 3 :(得分:0)

有更普遍的方法,但最初可能看起来很奇怪: 这里我们使用array_walk_recursive和一个闭包函数:

$array = array('a', 'b', array('x', 456 => 'y', 'z'));

$search = 456; // search for 456
$found = false;

array_walk_recursive($array, function ($value, $key) use ($search, &$found)
{
    if ($key == $search)
        $found = true;

});

if ($found == true)
  echo 'got it';

唯一的缺点是它会遍历所有值,即使它已经找到了密钥。这虽然适用于小阵列

答案 4 :(得分:0)

虽然我可能不会为此构建一个函数,但也许你可以更好地使用它:

<?php

function mda_isset( $array )
{
    $args = func_get_args();
    unset( $args[0] );

    if( count( $args ) > 0 )
    {
        foreach( $args as $x )
        {
            if( array_key_exists( $x, $array ) )
            {
                $array = $array[$x];
            }
            else
            {
                return false;
            }
        }
        if( isset( $array ) )
        {
            return true;
        }
    }
    return false;
}

?>

您可以根据需要添加任意数量的参数:

// Will Test $array['Test1']['Test2']['Test3']
$bool = mda_isset( $array, 'Test1', 'Test2', 'Test3' );

首先检查以确保数组键存在,将数组设置为该键,然后检查下一个键。如果找不到密钥,则表示它不存在。如果找到所有键,则检查该值是否已设置。