【问题标题】:PHP check if some keys or values are in a multidimensional arrayPHP 检查某些键或值是否在多维数组中
【发布时间】:2013-05-24 09:05:30
【问题描述】:

我有一个数组结构,我想检查数组中某处是否存在键/值。但我想以一种几乎镜像的验证数组的方式进行测试。

假设我有一个多维数组。这是我要验证的数据。

Array
(
[key1] => Array
    (
        [subkey1] => value
        [subkey2] => value
    )

[key2] => Array
    (
        [subkey3] => Array
            (
                [key1] => value
                [key2] => value
                [key3] => value
                [key4] => value
                [key5] => value
                [key6] => value
            )
    )
);

这是我的键和值的数组,需要出现在第一个数组中。

Array
(
[key1] => Array
    (
        [subkey2] => value
    )

[key2] => Array
    (
        [subkey3] => Array
            (
                [key5] => value
                [key6] => value
            )
    )
);

我无法比较这两个数组,因为它们永远不会相同。但是我需要以某种方式遍历数据数组并根据验证数组进行验证。键和值都需要在正确的位置,键需要相同的名称,值也应该相同。我只是不确定如何进行体面的检查。我可以做一些递归检查吗?由于某些键可以是一个值或另一个数组,因此它也需要检查这一点......这就是为什么我在考虑递归但我不知道如何做到这一点。

希望您能提供帮助。谢谢。

【问题讨论】:

  • 如果键匹配,“子键”数组是否应该被视为相等,或者所有值也应该匹配?
  • 关于价值观的一切。但是由于您需要验证一个值,因此数组键也需要相等,否则将找不到该值。这有意义吗?
  • 我认为您需要使用递归函数遍历数组来检查每个键和值。我认为没有更简单的方法了。
  • 至少做一个有效的例子;数组声明中不能有重复的键。
  • 我在想同样的事情@steven...知道我会怎么做吗?

标签: php arrays validation recursion multidimensional-array


【解决方案1】:

您可以使用它递归地确定是否所有必需的键都存在:

function has_recursive($data, $required)
{
    foreach ($required as $key => $value) {
        if (!isset($data[$key])/* && $data[$key] === $value */) {
            return false;
        }
        if (is_array($data[$key]) && false === has_recursive($data[$key], $value)) {
            return false;
        }
    }
    return true;
}

has_recursive($data, $required); // false or true

【讨论】:

  • Brilliant @Jack - 看起来很有前途。我会试一试。
  • 太棒了@Jack 我现在已经实现了解决方案并添加了对值的检查。它工作得很好......我不确定如何将我所做的检查添加到您的答案中。我对 stackoverflow 添加此类添加的方式不太熟悉。
  • 是的@Jack。如果有人应该找到这个线程,但你几乎总结了它:) 你现在应该得到一个赞成票。谢谢你的一切!
【解决方案2】:

我没有测试过,所以也许这不起作用(如果是这样,这将无济于事,我将删​​除答案)。

第一种方法是递归检查每个键值对,然后找到匹配的。

第二个选项可以是使用array_values()array_keys() 递归创建平面键值数组。我的意思是像

array(
  'subkey1' = array(
     'key1' = value1,
     'key2' = value2),
  'subkey2' = value3
)

你迭代递归做

array(
  'key1' = value1,
  'key2' = value2,
  'subkey2' = value3
)

如果您在比较两个数组的情况下执行此操作,则可以使用 array_intersect_assoc() 找到匹配的键值对。

但是,例如 'key1' == 'subkey2',这将不起作用。

【讨论】:

  • 好主意@Voitcus我唯一的问题是两个子数组是否包含具有不同值的相同键。我猜它会覆盖其中一个键。我不认为这是当前的情况,数据包含相同的键,但为了将来证明代码我害怕这样做:S
  • 是的,假设子数组中没有重复的键。就您而言,这是我的第一个提案,但仅由@Jack 标记和详细说明。然后你应该测试/改进并可能接受他的答案,因为只有递归搜索似乎是不敏感的。
猜你喜欢
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多