$main_id, 'gallery' => $gallery, ); } $others = self::without( $gallery, $attachment_id ); return array( 'main' => $main_id, 'gallery' => self::LAST === $position ? array_merge( $others, array( $attachment_id ) ) : array_merge( array( $attachment_id ), $others ), ); } /** * Вложение — изображением товара. * * @param int $attachment_id Вложение этого сохранения. * @param int $old_main_id Прежнее изображение товара; 0 — его не было. * @param int[] $gallery_ids Галерея сейчас, по порядку. * @param string $old_main_mode Что делать с прежним изображением — одно из OLD_MAIN_MODES; * незнакомое — TO_GALLERY: убирать фото без ясного выбора нельзя. * @return array{main: int, gallery: int[]} Изображение товара и галерея после. */ public static function set_main( int $attachment_id, int $old_main_id, array $gallery_ids, string $old_main_mode ): array { $gallery = self::unique_ids( $gallery_ids ); // Нечего ставить или это фото уже изображение товара — товар как был. if ( $attachment_id <= 0 || $attachment_id === $old_main_id ) { return array( 'main' => $old_main_id, 'gallery' => $gallery, ); } // Новое изображение товара из галереи уходит: одно фото в одном месте. $others = self::without( $gallery, $attachment_id ); if ( $old_main_id > 0 ) { $was_in_gallery = in_array( $old_main_id, $others, true ); $others = self::without( $others, $old_main_id ); // Прежнее изображение встаёт первым в галерее, если так велит настройка — // или если оно и так лежало в галерее: его туда положил человек. if ( $was_in_gallery || self::REMOVE !== $old_main_mode ) { $others = array_merge( array( $old_main_id ), $others ); } } return array( 'main' => $attachment_id, 'gallery' => $others, ); } /** * Положительные id без повторов, в исходном порядке. * * @param array $ids Id вложений. * @return int[] */ private static function unique_ids( array $ids ): array { $result = array(); foreach ( $ids as $id ) { $id = (int) $id; if ( $id > 0 && ! in_array( $id, $result, true ) ) { $result[] = $id; } } return $result; } /** * Список без одного id, в исходном порядке. * * @param int[] $ids Id вложений. * @param int $id Какой убрать. * @return int[] */ private static function without( array $ids, int $id ): array { return array_values( array_filter( $ids, static fn ( int $item ): bool => $item !== $id ) ); } }