首页 > 解决方案 > 如何根据 PHP 中的公共键值对对对象进行分组?

问题描述

我有一个包含如下对象的数组:

array:113 [
  0 => App\Api\Wheel {#5809
    -manufacturer: "RIAL"
    -colour: "diamant"
    -design: "aaaaaa"
    -surface: "ss"
    -diameter: 16
  }
  1 => App\Api\Wheel {#6201
    -manufacturer: "RIAL"
    -colour: "diamant"
    -design: "aaaaaa"
    -surface: "ss"
    -diameter: 17
  }

在这里,我需要根据值进行分组。直径会有所不同,而其他的会相同。

我的最终结果是相同的结构,但直径为数组或逗号分隔的字符串。

array:113 [
    0 => App\Api\Wheel {#5809
    -manufacturer: "RIAL"
    -colour: "diamant"
    -design: "aaaaaa"
    -surface: "ss"
    -diameter: [
            16,
            17      
        ]
    }

到目前为止,我已经尝试了以下代码行,

$finalResult = array();
        foreach ($records as $record) {
            if (!in_array($record->getManufacturer(), array_keys($finalResult))) {
                $finalResult[$record->getManufacturer()] = (object)array(
                    'manufacturer' => $record->getManufacturer(),
                    'colour' => $record->getColour(),
                    'design' => $record->getDesign(),
                    'surface' => $record->getSurface(),
                    'diameter' => $record->getDiameter()
                );
            } else {
                $finalResult[$record->getManufacturer()]->diameter = [$record->getDiameter()];
            }
        }
        dd(($finalResult));

但是,我无法分组或将结果返回为相同的格式。

任何机构都可以帮助我吗?

标签: phparraysobjectgrouping

解决方案


您需要更新else块中的代码以处理添加另一个diameter值,目前您只是覆盖现有值。要制作一个数组,如下所示:

if (is_array($finalResult[$record->getManufacturer()]->diameter)) {
    $finalResult[$record->getManufacturer()]->diameter[] = $record->getDiameter();
}
else {
    $finalResult[$record->getManufacturer()]->diameter = array($finalResult[$record->getManufacturer()]->diameter, 
                                                               $record->getDiameter());
}

制作一个逗号分隔的列表要容易一些:

$finalResult[$record->getManufacturer()]->diameter .= ',' . $record->getDiameter();

注意

!in_array($record->getManufacturer(), array_keys($finalResult))

可以替换为

!isset($finalResult[$record->getManufacturer()])

这会快得多。


推荐阅读