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

如何基于对象特定属性统计数组?(PHP 5.3遗留系统)

可行的PHP 5.3兼容统计方案

针对你提供的包含stdClass对象的数组,由于PHP 5.3的版本限制,我们可以用最基础的foreach循环实现各类统计需求,以下是几种常见场景的具体实现:

场景1:按position统计员工人数

统计每个职位对应的员工数量:

// 初始化统计容器
$positionCount = array();

// 遍历员工数组
foreach ($employeeArray as $employee) {
    $pos = $employee->position;
    // 累计对应职位的人数
    if (isset($positionCount[$pos])) {
        $positionCount[$pos]++;
    } else {
        $positionCount[$pos] = 1;
    }
}

// 输出统计结果
print_r($positionCount);

运行后会得到类似结果:

Array
(
    [POS 1] => 1
    [POS 2] => 1
)

场景2:统计单个员工的各类班次天数

比如统计ID为12345的员工,其REST DAY、DAY OFF、正常班次等的天数:

// 指定目标员工ID
$targetId = 12345;
// 初始化统计项
$shiftStats = array(
    'REST DAY' => 0,
    'DAY OFF' => 0,
    'WORK SHIFT' => 0,
    'UNASSIGNED' => 0
);

foreach ($employeeArray as $employee) {
    if ($employee->ID == $targetId) {
        // 遍历员工对象的所有属性
        foreach ($employee as $key => $value) {
            // 跳过非日期类属性
            if (!strpos($key, '-')) {
                continue;
            }
            $val = trim($value);
            // 按班次类型分类统计
            switch ($val) {
                case 'REST DAY':
                    $shiftStats['REST DAY']++;
                    break;
                case 'DAY OFF':
                    $shiftStats['DAY OFF']++;
                    break;
                case ' - ':
                    $shiftStats['UNASSIGNED']++;
                    break;
                default:
                    // 匹配带时间区间的正常班次
                    if (strpos($val, '-')) {
                        $shiftStats['WORK SHIFT']++;
                    }
                    break;
            }
        }
        break; // 找到目标员工后终止循环
    }
}

print_r($shiftStats);

输出结果类似:

Array
(
    [REST DAY] => 2
    [DAY OFF] => 1
    [WORK SHIFT] => 7
    [UNASSIGNED] => 4
)

场景3:全局统计所有员工的各类班次总数

统计所有员工的REST DAY、DAY OFF等总天数:

$globalStats = array(
    'REST DAY' => 0,
    'DAY OFF' => 0,
    'WORK SHIFT' => 0,
    'UNASSIGNED' => 0
);

foreach ($employeeArray as $employee) {
    foreach ($employee as $key => $value) {
        // 只处理日期属性
        if (!strpos($key, '-')) {
            continue;
        }
        $val = trim($value);
        if ($val == 'REST DAY') {
            $globalStats['REST DAY']++;
        } elseif ($val == 'DAY OFF') {
            $globalStats['DAY OFF']++;
        } elseif ($val == ' - ') {
            $globalStats['UNASSIGNED']++;
        } elseif (strpos($val, '-')) {
            $globalStats['WORK SHIFT']++;
        }
    }
}

print_r($globalStats);

注意事项

  1. PHP 5.3中访问stdClass对象属性直接使用->语法即可,无需额外处理
  2. 日期属性的判断用strpos($key, '-')做简单识别,若需更严格的日期格式校验,可替换为正则表达式:preg_match('/^\d{4}-\d{2}-\d{2}$/', $key)
  3. 所有代码均兼容PHP 5.3,无需依赖高版本函数

内容的提问来源于stack exchange,提问作者Bernard Gresola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:13:59