}> $variations Вариации товара: * id и значения атрибутов * (код атрибута → код значения, * пустая строка — «любой»). * @param array $choice Выбор: код атрибута → код значения. * @return int[] */ public static function matching( array $variations, array $choice ): array { $chosen = array(); foreach ( $choice as $code => $value ) { $code = (string) $code; $value = (string) $value; if ( '' !== $code && '' !== $value ) { $chosen[ $code ] = $value; } } if ( array() === $chosen ) { return array(); } $result = array(); foreach ( $variations as $variation ) { $attributes = is_array( $variation['attributes'] ?? null ) ? $variation['attributes'] : array(); if ( self::fits( $attributes, $chosen ) ) { $result[] = (int) ( $variation['id'] ?? 0 ); } } return array_values( array_filter( $result, static fn ( int $id ): bool => $id > 0 ) ); } /** * Подходит ли вариация под выбор. * * @param array $attributes Значения атрибутов вариации; нет ключа или пусто — «любой». * @param array $chosen Выбор без пустых значений. * @return bool */ private static function fits( array $attributes, array $chosen ): bool { foreach ( $chosen as $code => $value ) { $own = (string) ( $attributes[ $code ] ?? '' ); if ( '' !== $own && $own !== $value ) { return false; } } return true; } }