【问题标题】:Merge two objects in php with slightly different properties在php中合并两个属性略有不同的对象
【发布时间】:2017-11-28 11:33:29
【问题描述】:

我有两个对象数组,它们从 DB 查询中填充并定义如下:

array1:

foreach ($grade_records as $record) {
    $grade_object = new stdClass();
    $grade_object->fields = array(
        'id'    => $record->id,
        'grade'    => $record->grade,
        'user_id'   => $record->user_id,
        'course_id' => $record->course_id,
    );

    array_push($grades, $grade_object);
}

数组2:

foreach ($attendance_records as $record) {
    $attendance_object = new stdClass();
    $attendance_object->fields = array(
        'id'         => $record->id,
        'attendance' => $record->attendance,
        'user_id'    => $record->user_id,
        'course_id'  => $record->course_id
    );

    array_push($attendance, $attendance_object);
}

我想以最有效的方式将这些数组合并到一个包含对象的数组中,这些对象具有每个对象的组合属性。 我尝试使用以下代码:

foreach ($attendance as $att_record) {
    foreach ($grades as $grd_record) {
        if ($att_record->id == $grd_record->id) {
           $new = (object) array_merge((array) $att_record, (array) $grd_record);
           array_push($final_array, $new);
        }
    }
}

但这给了我一个没有添加“等级”属性的数组。 我也尝试过使用array_merge_recursive,但没有任何改变。

编辑: 最终使用了这个:

foreach ($att_objs as $att_key => $att_data) {
    foreach ($grd_objs as $grd_key => $grd_data) {
        if ($grd_data->fields['Id'] == $att_data->fields['Id']) {
            $merged_obj = new stdclass();
            $merged_obj->fields = array_merge($att_data->fields, $grd_data->fields);
            unset($att_objs[$att_key]);
            unset($grd_objs[$grd_key]);
            array_push($merged_objs, $merged_obj);
        }
    }
}
$merged_objs = array_merge($merged_objs, $att_objs);
$merged_objs = array_merge($merged_objs, $grd_objs);

【问题讨论】:

  • 执行时有什么错误吗?
  • 执行时没有看到任何错误

标签: php arrays oop object merge


【解决方案1】:

array_merge() 中,如果两个或多个数组元素具有相同的键,则最后一个覆盖其他元素。在您的情况下,$att_record$grd_record 都具有相同的键 'fields'。因此,如果您替换其中任何一个中的'fields' 键,您将获得所需的结果。

【讨论】:

    【解决方案2】:

    这个怎么样?

    <?php
    
    $grades = [];
    
    foreach ($grade_records as $record) {
        $grade_object = new stdClass();
        $grade_object->fields = array(
            'id'        => $record->id,
            'grade'     => $record->grade,
            'user_id'   => $record->user_id,
            'course_id' => $record->course_id,
        );
    
        $grades[$record->id] = $grade_object;
    }
    
    $attendance = [];
    
    foreach ($attendance_records as $record) {
        $attendance_object = new stdClass();
        $attendance_object->fields = array(
            'id'         => $record->id,
            'attendance' => $record->attendance,
            'user_id'    => $record->user_id,
            'course_id'  => $record->course_id
        );
    
        $attendance[$record->id] = $attendance_object;
    }
    
    $identifiers = array_intersect(
        array_keys($grades),
        array_keys($attendance)
    );
    
    $final_array = [];
    
    foreach ($identifiers as $id) {
        $object = new \stdClass();
        $object->fields = \array_merge(
            $grades[$id]->fields,
            $attendance[$id]->fields
        );
    
        $final_array[] = $object;
    }
    

    【讨论】:

    • 最终使用了不同的解决方案,但我会将您的解决方案标记为最彻底的解决方案
    猜你喜欢
    • 2022-11-15
    • 2019-01-15
    • 2020-07-05
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2014-03-10
    • 2020-11-16
    • 1970-01-01
    相关资源
    最近更新 更多