PHP使用多维数组按item_id和quantity统计条件匹配次数
PHP实现基于item_id的物品条件匹配次数统计
需要实现一套统计逻辑,基于item_id和quantity两个字段,计算$items_array可满足$condition_array条件的次数,统计规则如下:
- 存在性校验:
$condition_array中所有条目对应的item_id必须全部存在于$items_array中,任意id缺失则最终统计结果为0 - 商值计算:对所有item_id匹配的条目,用
$items_array中对应id的quantity除以$condition_array中对应id的quantity,取整数商 - 结果取值:所有整数商的最小值即为最终统计结果,计算过程中任意商小于1则结果为0
基础示例
<?php $items_array = [ ['item_id'=>1, 'quantity'=>1], ['item_id'=>11, 'quantity'=>3], ['item_id'=>12, 'quantity'=>6] ]; $condition_array = [ ['item_id'=>11, 'quantity'=>1], ['item_id'=>12, 'quantity'=>2] ]; $count = ?; // 预期结果为3 ?>
示例说明:该示例预期返回3,$condition_array的两个item_id都存在于$items_array中,对应商分别为3/1=3、6/2=3,取最小值为3。
场景测试用例
以下是不同边界场景的测试用例及预期结果:
用例1:缺失必填item_id
<?php $items_array = [ ['item_id'=>12, 'quantity'=>2] ]; $condition_array = [ ['item_id'=>11, 'quantity'=>1], ['item_id'=>12, 'quantity'=>2] ]; $count = ?; // 预期结果为0 ?>
预期说明:$items_array中缺失item_id=11的条目,结果返回0。
用例2:单类物品数量不足
<?php $items_array = [ ['item_id'=>1, 'quantity'=>1], ['item_id'=>11, 'quantity'=>2], ['item_id'=>12, 'quantity'=>1] ]; $condition_array = [ ['item_id'=>11, 'quantity'=>1], ['item_id'=>12, 'quantity'=>2] ]; $count = ?; // 预期结果为0 ?>
预期说明:item_id=12的数量商为1/2<1,不满足匹配要求,结果返回0。
用例3:单次完全匹配
<?php $items_array = [ ['item_id'=>12, 'quantity'=>2], ['item_id'=>11, 'quantity'=>1] ]; $condition_array = [ ['item_id'=>11, 'quantity'=>1], ['item_id'=>12, 'quantity'=>2] ]; $count = ?; // 预期结果为1 ?>
预期说明:物品数量刚好满足1次条件匹配,结果返回1。
用例4:多品类取最小商值
<?php $items_array = [ ['item_id'=>1, 'quantity'=>4], ['item_id'=>12, 'quantity'=>1], ['item_id'=>11, 'quantity'=>1] ]; $condition_array = [ ['item_id'=>1, 'quantity'=>2], ['item_id'=>12, 'quantity'=>1] ]; $count = ?; // 预期结果为1 ?>
预期说明:item_id=1的商为4/2=2,但item_id=12的商仅为1/1=1,取最小值返回1;如果item_id=12的quantity为2,结果则为2。
实现代码
查阅PHP官方数组函数手册,未找到可直接实现该逻辑的内置函数,可通过如下自定义方法实现:
function calculateMatchCount(array $itemsArray, array $conditionArray): int { // 重组物品数组为item_id=>quantity的映射,避免重复遍历 $itemMap = []; foreach ($itemsArray as $item) { $itemMap[$item['item_id']] = $item['quantity']; } $minCount = PHP_INT_MAX; foreach ($conditionArray as $condition) { $targetId = $condition['item_id']; $requiredQty = $condition['quantity']; // 缺失对应物品直接返回0 if (!isset($itemMap[$targetId])) { return 0; } // 用intdiv做整数除法,避免浮点数精度问题 $quotient = intdiv($itemMap[$targetId], $requiredQty); // 数量不足1次匹配直接返回0 if ($quotient < 1) { return 0; } // 更新最小可匹配次数 $minCount = min($minCount, $quotient); } // 兼容条件数组为空的边界场景 return $minCount === PHP_INT_MAX ? 0 : $minCount; }
实现说明:
- 提前将物品列表重组为键值对映射,单id查找效率从O(n)提升到O(1),整体时间复杂度为O(n+m)
- 遍历条件列表时遇到不满足要求的场景直接终止返回,减少无效计算
- 采用
intdiv做整数向下取整,规避浮点数计算的精度误差 - 额外兼容了条件数组为空的边界情况,默认返回0
内容的提问来源于stack exchange,提问作者Koala
相关产品推荐
相关产品推荐

