You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:15:36