如何检查是否存在多个数组键

时间:2012-11-01 01:00:31

标签: php key

我有各种包含

的数组
story & message

或只是

story

我如何检查数组是否同时包含故事和消息? array_key_exists()仅查找数组中的单个键。

有办法做到这一点吗?

21 个答案:

答案 0 :(得分:178)

这是一个可扩展的解决方案,即使您要检查大量密钥:

<?php

// The values in this arrays contains the names of the indexes (keys) 
// that should exist in the data array
$required = array('key1', 'key2', 'key3');

$data = array(
    'key1' => 10,
    'key2' => 20,
    'key3' => 30,
    'key4' => 40,
);

if (count(array_intersect_key(array_flip($required), $data)) === count($required)) {
    // All required keys exist!
}

答案 1 :(得分:45)

如果您只有2个要检查的密钥(就像在原始问题中一样),那么只需拨打array_key_exists()两次以检查密钥是否存在就足够了。

if (array_key_exists("story", $arr) && array_key_exists("message", $arr)) {
    // Both keys exist.
}

然而,这显然不能很好地扩展到许多键。在那种情况下,自定义函数会有所帮助。

function array_keys_exists(array $keys, array $arr) {
   return !array_diff_key(array_flip($keys), $arr);
}

答案 2 :(得分:32)

令人惊讶array_keys_exist不存在?!在此期间,留出一些空间来为这个常见任务找出单行表达式。我正在考虑使用shell脚本或其他小程序。

注意:以下每个解决方案都使用php 5.4+中提供的简明[…]数组声明语法

array_diff + array_keys

if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
  // all keys found
} else {
  // not all
}

(帽子提示为Kim Stacks

这种方法是我发现的最简短的方法。 array_diff()返回参数1中存在的参数1 而不是中的项数组。因此,空数组表示找到了所有键。在PHP 5.5中,您可以将0 === count(…)简化为empty(…)

array_reduce + unset

if (0 === count(array_reduce(array_keys($source), 
    function($in, $key){ unset($in[array_search($key, $in)]); return $in; }, 
    ['story', 'message', '…'])))
{
  // all keys found
} else {
  // not all
}

难以阅读,易于更改。 array_reduce()使用回调迭代数组以获得值。通过提供我们对$initial的{​​{1}}值感兴趣的密钥然后删除源中找到的密钥,如果找到所有密钥,我们可以期望以0个元素结束。

构造很容易修改,因为我们感兴趣的键非常适合底线。

array_filter&amp; in_array

$in

if (2 === count(array_filter(array_keys($source), function($key) { return in_array($key, ['story', 'message']); } ))) { // all keys found } else { // not all } 解决方案编写起来更简单,但编辑时略显诡计。 array_reduce也是一个迭代回调,允许您通过在回调中返回true(复制项目到新数组)或false(不复制)来创建过滤数组。 gotchya是您必须将array_filter更改为您期望的项目数。

这可以变得更加持久,但是对于荒谬的可读性而言更是如此:

2

答案 3 :(得分:14)

在我看来,到目前为止最简单的方法是:

$required = array('a','b','c','d');

$values = array(
    'a' => '1',
    'b' => '2'
);

$missing = array_diff_key(array_flip($required), $values);

打印:

Array(
    [c] => 2
    [d] => 3
)

这也可以确切地检查哪些键丢失了。这可能对错误处理很有用。

答案 4 :(得分:7)

上述解决方案很聪明,但速度很慢。使用isset的简单foreach循环的速度是array_intersect_key解决方案的两倍多。

function array_keys_exist($keys, $array){
    foreach($keys as $key){
        if(!array_key_exists($key, $array))return false;
    }
    return true;
}

(对于1000000次迭代,344ms对768ms)

答案 5 :(得分:3)

这个怎么样:

isset($arr['key1'], $arr['key2']) 

如果两者都不为空,则仅返回true

如果为null,则键不在数组

答案 6 :(得分:3)

另一种可能的解决方案:

if (!array_diff(['story', 'message'], array_keys($array))) {
    // OK: all the keys are in $array
} else {
   // FAIL: some keys are not
}

答案 7 :(得分:2)

如果你有这样的事情:

$stuff = array();
$stuff[0] = array('story' => 'A story', 'message' => 'in a bottle');
$stuff[1] = array('story' => 'Foo');

你可以简单地count()

foreach ($stuff as $value) {
  if (count($value) == 2) {
    // story and message
  } else {
    // only story
  }
}

这只有在您确定只有这些数组键时才有效。

使用array_key_exists()仅支持一次检查一个键,因此您需要单独检查两个键:

foreach ($stuff as $value) {
  if (array_key_exists('story', $value) && array_key_exists('message', $value) {
    // story and message
  } else {
    // either one or both keys missing
  }
}
如果键存在于数组中,则

array_key_exists()返回true,但它是一个真正的函数,需要输入很多。语言构造isset()几乎会做同样的事情,除非测试的值是NULL:

foreach ($stuff as $value) {
  if (isset($value['story']) && isset($value['message']) {
    // story and message
  } else {
    // either one or both keys missing
  }
}

另外,isset允许一次检查多个变量:

foreach ($stuff as $value) {
  if (isset($value['story'], $value['message']) {
    // story and message
  } else {
    // either one or both keys missing
  }
}

现在,为了优化测试设置的内容,你最好使用“if”:

foreach ($stuff as $value) {
  if (isset($value['story']) {
    if (isset($value['message']) {
      // story and message
    } else {
      // only story
    }
  } else {
    // No story - but message not checked
  }
}

答案 8 :(得分:1)

这是我为自己在课堂上使用的函数。

<?php
/**
 * Check the keys of an array against a list of values. Returns true if all values in the list
 is not in the array as a key. Returns false otherwise.
 *
 * @param $array Associative array with keys and values
 * @param $mustHaveKeys Array whose values contain the keys that MUST exist in $array
 * @param &$missingKeys Array. Pass by reference. An array of the missing keys in $array as string values.
 * @return Boolean. Return true only if all the values in $mustHaveKeys appear in $array as keys.
 */
    function checkIfKeysExist($array, $mustHaveKeys, &$missingKeys = array()) {
        // extract the keys of $array as an array
        $keys = array_keys($array);
        // ensure the keys we look for are unique
        $mustHaveKeys = array_unique($mustHaveKeys);
        // $missingKeys = $mustHaveKeys - $keys
        // we expect $missingKeys to be empty if all goes well
        $missingKeys = array_diff($mustHaveKeys, $keys);
        return empty($missingKeys);
    }


$arrayHasStoryAsKey = array('story' => 'some value', 'some other key' => 'some other value');
$arrayHasMessageAsKey = array('message' => 'some value', 'some other key' => 'some other value');
$arrayHasStoryMessageAsKey = array('story' => 'some value', 'message' => 'some value','some other key' => 'some other value');
$arrayHasNone = array('xxx' => 'some value', 'some other key' => 'some other value');

$keys = array('story', 'message');
if (checkIfKeysExist($arrayHasStoryAsKey, $keys)) { // return false
    echo "arrayHasStoryAsKey has all the keys<br />";
} else {
    echo "arrayHasStoryAsKey does NOT have all the keys<br />";
}

if (checkIfKeysExist($arrayHasMessageAsKey, $keys)) { // return false
    echo "arrayHasMessageAsKey has all the keys<br />";
} else {
    echo "arrayHasMessageAsKey does NOT have all the keys<br />";
}

if (checkIfKeysExist($arrayHasStoryMessageAsKey, $keys)) { // return false
    echo "arrayHasStoryMessageAsKey has all the keys<br />";
} else {
    echo "arrayHasStoryMessageAsKey does NOT have all the keys<br />";
}

if (checkIfKeysExist($arrayHasNone, $keys)) { // return false
    echo "arrayHasNone has all the keys<br />";
} else {
    echo "arrayHasNone does NOT have all the keys<br />";
}

我假设您需要检查数组中的所有多个键是否存在。如果您正在寻找至少一个键的匹配,请告诉我,以便我可以提供其他功能。

此处的键盘http://codepad.viper-7.com/AKVPCH

答案 9 :(得分:1)

我经常使用类似的东西

$wantedKeys = ['story', 'message'];
$hasWantedKeys = count(array_intersect(array_keys($source), $wantedKeys)) > 0

或查找所需键的值

$wantedValues = array_intersect_key($source, array_fill_keys($wantedKeys, 1))

答案 10 :(得分:1)

试试这个

$required=['a','b'];$data=['a'=>1,'b'=>2];
if(count(array_intersect($required,array_keys($data))>0){
    //a key or all keys in required exist in data
 }else{
    //no keys found
  }

答案 11 :(得分:1)

希望这会有所帮助:

function array_keys_exist($searchForKeys = array(), $inArray = array()) {
    $inArrayKeys = array_keys($inArray);
    return count(array_intersect($searchForKeys, $inArrayKeys)) == count($searchForKeys); 
}

答案 12 :(得分:0)

    $colsRequired   = ["apple", "orange", "banana", "grapes"];
    $data           = ["apple"=>"some text", "orange"=>"some text"];
    $presentInBoth  = array_intersect($colsRequired,array_keys($data));

    if( count($presentInBoth) != count($colsRequired))
        echo "Missing keys  :" . join(",",array_diff($colsRequired,$presentInBoth));
    else
        echo "All Required cols are present";

答案 13 :(得分:0)

我通常使用函数来验证我的帖子,这也是该问题的答案,所以让我发布。

调用我的函数,我将使用2数组

validatePost(['username', 'password', 'any other field'], $_POST))

然后我的函数将如下所示

 function validatePost($requiredFields, $post)
    {
        $validation = [];

        foreach($requiredFields as $required => $key)
        {
            if(!array_key_exists($key, $post))
            {
                $validation['required'][] = $key;
            }
        }

        return $validation;
    }

这将输出

“必填”:[ “用户名”, “密码”, “任何其他领域” ]

因此,此函数的作用是验证并返回发布请求的所有缺失字段。

答案 14 :(得分:0)

这是旧的,可​​能会被埋葬,但这是我的尝试。

我遇到了与@Ryan类似的问题。在某些情况下,我只需检查数组中是否至少有一个键,在某些情况下,所有都需要存在。

所以我写了这个函数:

/**
 * A key check of an array of keys
 * @param array $keys_to_check An array of keys to check
 * @param array $array_to_check The array to check against
 * @param bool $strict Checks that all $keys_to_check are in $array_to_check | Default: false
 * @return bool
 */
function array_keys_exist(array $keys_to_check, array $array_to_check, $strict = false) {
    // Results to pass back //
    $results = false;

    // If all keys are expected //
    if ($strict) {
        // Strict check //

        // Keys to check count //
        $ktc = count($keys_to_check);
        // Array to check count //
        $atc = count(array_intersect($keys_to_check, array_keys($array_to_check)));

        // Compare all //
        if ($ktc === $atc) {
            $results = true;
        }
    } else {
        // Loose check - to see if some keys exist //

        // Loop through all keys to check //
        foreach ($keys_to_check as $ktc) {
            // Check if key exists in array to check //
            if (array_key_exists($ktc, $array_to_check)) {
                $results = true;
                // We found at least one, break loop //
                break;
            }
        }
    }

    return $results;
}

这比编写多个||&&块要容易得多。

答案 15 :(得分:0)

可以使用的东西

//Say given this array
$array_in_use2 = ['hay' => 'come', 'message' => 'no', 'story' => 'yes'];
//This gives either true or false if story and message is there
count(array_intersect(['story', 'message'], array_keys($array_in_use2))) === 2;
  

注意检查2,如果您要搜索的值不同,则可以更改。

     
    

这个解决方案效率可能不高,但它确实有效!

  

<强>更新

在一个 fat <​​/ em>函数中:

 /**
 * Like php array_key_exists, this instead search if (one or more) keys exists in the array
 * @param array $needles - keys to look for in the array
 * @param array $haystack - the <b>Associative</b> array to search
 * @param bool $all - [Optional] if false then checks if some keys are found
 * @return bool true if the needles are found else false. <br>
 * Note: if hastack is multidimentional only the first layer is checked<br>,
 * the needles should <b>not be<b> an associative array else it returns false<br>
 * The array to search must be associative array too else false may be returned
 */
function array_keys_exists($needles, $haystack, $all = true)
{
    $size = count($needles);
    if($all) return count(array_intersect($needles, array_keys($haystack))) === $size;
    return !empty(array_intersect($needles, array_keys($haystack)));

}

例如,举例:

$array_in_use2 = ['hay' => 'come', 'message' => 'no', 'story' => 'yes'];
//One of them exists --> true
$one_or_more_exists = array_keys_exists(['story', 'message'], $array_in_use2, false);
//all of them exists --> true
$all_exists = array_keys_exists(['story', 'message'], $array_in_use2);

希望这会有所帮助:)

答案 16 :(得分:0)

$myArray = array('key1' => '', 'key2' => '');
$keys = array('key1', 'key2', 'key3');
$keyExists = count(array_intersect($keys, array_keys($myArray)));

将返回true,因为$ myArray中有$ keys数组的键

答案 17 :(得分:0)

// sample data
$requiredKeys = ['key1', 'key2', 'key3'];
$arrayToValidate = ['key1' => 1, 'key2' => 2, 'key3' => 3];

function keysExist(array $requiredKeys, array $arrayToValidate) {
    if ($requiredKeys === array_keys($arrayToValidate)) {
        return true;
    }

    return false;
}

答案 18 :(得分:0)

我不确定,如果这是个坏主意,但我使用非常简单的foreach循环来检查多个数组键。

// get post attachment source url
$image     = wp_get_attachment_image_src(get_post_thumbnail_id($post_id), 'single-post-thumbnail');
// read exif data
$tech_info = exif_read_data($image[0]);

// set require keys
$keys = array('Make', 'Model');

// run loop to add post metas foreach key
foreach ($keys as $key => $value)
{
    if (array_key_exists($value, $tech_info))
    {
        // add/update post meta
        update_post_meta($post_id, MPC_PREFIX . $value, $tech_info[$value]);
    }
} 

答案 19 :(得分:0)

<?php

function check_keys_exists($keys_str = "", $arr = array()){
    $return = false;
    if($keys_str != "" and !empty($arr)){
        $keys = explode(',', $keys_str);
        if(!empty($keys)){
            foreach($keys as $key){
                $return = array_key_exists($key, $arr);
                if($return == false){
                    break;
                }
            }
        }
    }
    return $return;
}

//运行演示

$key = 'a,b,c';
$array = array('a'=>'aaaa','b'=>'ccc','c'=>'eeeee');

var_dump( check_keys_exists($key, $array));

答案 20 :(得分:0)

这不起作用吗?

array_key_exists('story', $myarray) && array_key_exists('message', $myarray)