我喜欢数组遵循这样定义的结构:
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
,或者需要循环来完成此操作。
感谢您的帮助!
我通常反对将
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,
)