【问题标题】:Matching partial assoc array in bigger assoc array [closed]在更大的关联数组中匹配部分关联数组[关闭]
【发布时间】:2021-02-16 14:30:14
【问题描述】:

我有两个数组:

$array1 = [
    'user_id' => '1234567890', 
    'customer_id' => [
        '889599494514048876' => [admin => true],
        '006994743818411627' => [admin => false],
        '259960192293339276' => [admin => false]
    ]
];
$array2 = [
    'customer_id' => [
        '259960192293339276' => [admin => false]
    ]
];

我想检查array2是否存在于array1中。

“理想情况下”解决方案将是动态的,因此无论数组结构如何嵌套或不同,它仍然可以工作。尽管如此,任何解决方案或想法仍然非常感谢,因为我很困惑。

我查看了 array_intersect 和 array_uintersect,虽然我还没有让它们像我想要的那样工作。

【问题讨论】:

  • 您要求的内容过于广泛:“无论数组结构如何嵌套或不同”。您需要将问题缩小到可以合理回答的范围内。甚至不清楚您提供的示例数据的正确结果是什么 - 从字面上看,答案将是错误的($array1 中不存在$array2)但$array2$array1 的子集( $array1 可以从 $array2 开始构造并添加元素)所以也许答案应该是正确的?
  • 引用我自己的话,我说“理想情况下”,而且我知道这是一个宽泛的说法,但 Chris 设法找到了一个无论嵌套多深都能奏效的解决方案。我没有想过使用递归函数,这很可能是这种情况下最简洁的解决方案。

标签: php arrays associative-array array-intersect


【解决方案1】:

你可以只使用一个简单的递归函数。

对于给定的数据:

$array1 = [
    'user_id' => '1234567890',
    'customer_id' => [
        '889599494514048876' => ['admin' => true],
        '006994743818411627' => ['admin' => false],
        '259960192293339276' => ['admin' => false]
    ]
];

$array2 = [
    'customer_id' => [
        '259960192293339276' => ['admin' => false]
    ]
];

这个函数应该可以工作,见代码cmets:

function isArraySubSetOfOtherArray(array $childArray, array $potentialParent): bool
{
    foreach ($childArray as $key => $value) {

        // If the other array doesn't have this key, fail
        if (!array_key_exists($key, $potentialParent)) {
            return false;
        }

        // Make sure the values are the same type, otherwise fail
        if (gettype($value) !== gettype($potentialParent[$key])) {
            return false;
        }

        // For scalar types, test them directly
        if (is_scalar($value)) {
            if ($value !== $potentialParent[$key]) {
                return false;
            }
            continue;
        }

        // For array, recurse into this same function
        if (is_array($value)) {
            if (!isArraySubSetOfOtherArray($value, $potentialParent[$key])) {
                return false;
            }
            continue;
        }

        // For anything else, fail or write some other logic
        throw new RuntimeException('Unsupported type');
    }

    // The loop passed without return false, so it is a subset
    return true;
}
assert(isArraySubSetOfOtherArray($array2, $array1));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多