PHP 多维数组遵循定义的键结构

问题描述 投票:0回答:1

我喜欢数组遵循这样定义的结构:

array (
  'id' => '',
  'name' => '',
  'quantity' => '',
)

这是我想在多维数组列表中遵循的结构。示例:

array (
    array (
      'id' => 'GFKHF312',
      'name' => 'Item 1',
      'quantity' => 1
    ),
    array (
      'id' => 'YUKKU134',
      'name' => 'item 2',
      'quantity' => 5
    ),
    array (
      'id' => 'TRUT243',
      'name' => 'item 3',
      'quantity' => 10
    )
)

所以我想:

在传递的所有其他名称键中,当尝试向列表中添加新行时,应将其删除或过滤。

示例:

# When passed this data
array (
    'id' => 'GFKHF312',
    'name' => 'Item',
    'quantity' => 1,
    'new_key' => 120,
    'other_key' => 'fsdfs',
)

# It should filter to this data
array (
    'id' => 'GFKHF312',
    'name' => 'Item',
    'quantity' => 1
)

其次,如果它没有在结构中定义所有键(

'id', 'name', 'quantity'
),它应该失败(返回 false 或 null)。

示例:

# When passed this data
array (
    'id' => 'GFKHF312',
    'quantity' => 1,
)

# It should return this data
false

是否可以使用 php 数组函数,例如

array_diff
,或者需要循环来完成此操作。

感谢您的帮助!

php arrays multidimensional-array
1个回答
0
投票

我通常反对将

array
的返回类型与
boolean
的返回类型混合——这是有效的,但我建议不要这样做,因为 PHP 没有方便的“虚假类型”运算符和函数,但它确实如此但是有“可为空类型”。作为妥协,我将设计我的解决方案以无条件返回布尔类型值,并且输入数组将通过引用进行修改。

所需内容的核心可以简单地使用

array_diff_key()
返回
false
结果并使用
array_intersect_key()
从数组中删除意外的列来实现。

代码:(演示

function validateAndSanitize(array &$input, array $structure): bool {
    if (array_diff_key($structure, $input)) {
        return false; // missing required column(s)
    }
    $input = array_intersect_key($input, $structure); // prune unexpected columns
    return true;
}

$structure = ['id' => '', 'name' => '', 'quantity' => ''];

$array = [
    'id' => 'GFKHF312',
    'name' => 'Item',
    'quantity' => 1,
    'new_key' => 120,
    'other_key' => 'fsdfs',
];

if (!validateAndSanitize($array, $structure)) {
    echo "bonk\n";
}
var_export($array);

输出:

array (
  'id' => 'GFKHF312',
  'name' => 'Item',
  'quantity' => 1,
)
© www.soinside.com 2019 - 2024. All rights reserved.