✘✘ GRAYBYTE WORDPRESS FILE MANAGER ✘✘

​🇳​​🇦​​🇲​​🇪♯➤ webm004.cluster127.gra.hosting.ovh.net ​🇻​♯➤ 6.18.42-ovh-vps-grsec-zfs+ #1 SMP 🇾​♯➤ 2026

𝗛𝗢𝗠𝗘 𝗜𝗗 ♯➤ 54.36.91.62 ♯➤ 𝗔𝗗𝗠𝗜𝗡 𝗜𝗗 216.73.216.223
𝗢𝗣𝗧𝗜𝗢𝗡𝗦 ♯ CRL ♯➤ 𝗢𝗞 ┃ WGT ♯➤ 𝗢𝗞 ┃ SDO ♯➤ 𝗢𝗙𝗙 ┃ PKEX ♯➤ 𝗢𝗙𝗙
𝗗𝗘𝗔𝗖𝗧𝗜𝗩𝗔𝗧𝗘𝗗 ♯➤ _dyuweyrj4,_dyuweyrj4r,dl

𝗛𝗢𝗠𝗘
𝗖𝗨𝗥𝗥𝗘𝗡𝗧 𝗙𝗜𝗟𝗘 : /home/docteuh/www/infrastructure//properties-merger.php
<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Schema_Aggregator\Application;

use Yoast\WP\SEO\Schema_Aggregator\Domain\Schema_Piece;

/**
 * Merges properties of two schema pieces with the same @id.
 */
class Properties_Merger {

	/**
	 * Merges two Schema_Pieces into one by merging their properties.
	 *
	 * @param Schema_Piece $piece1 First schema piece.
	 * @param Schema_Piece $piece2 Second schema piece.
	 *
	 * @return Schema_Piece Merged schema piece.
	 */
	public function merge( Schema_Piece $piece1, Schema_Piece $piece2 ): Schema_Piece {
		$merged_properties = $this->merge_properties( $piece1->get_data(), $piece2->get_data() );
		// TODO: Shall we check if $type !== null?
		return new Schema_Piece( $merged_properties, $merged_properties['@type'] );
	}

	/**
	 * Merge properties from two schema entities with the same @id
	 *
	 * Strategy:
	 * - @type: Special handling - merge types into unified array
	 * - @id: Skip (always the same)
	 * - Arrays: Combine unique values
	 * - Scalars: Prefer non-empty over empty
	 * - Objects: Deep merge recursively
	 * - Null vs value: Prefer non-null
	 *
	 * @param array<string, string|int|bool> $entity1 First entity.
	 * @param array<string, string|int|bool> $entity2 Second entity.
	 *
	 * @return array<string, string|int|bool> Merged entity.
	 */
	private function merge_properties( array $entity1, array $entity2 ): array {
		$merged = $entity1;

		foreach ( $entity2 as $key => $value ) {

			if ( $key === '@id' ) {
				continue;
			}

			// Special handling for @type - merge types (JSON-LD allows multiple types).
			if ( $key === '@type' ) {
				$merged['@type'] = $this->merge_types(
					( $merged['@type'] ?? null ),
					$value,
				);
				continue;
			}

			if ( ! isset( $merged[ $key ] ) || $merged[ $key ] === '' ) {

				$merged[ $key ] = $value;
			}
			elseif ( \is_array( $merged[ $key ] ) && \is_array( $value ) ) {
				// Both are arrays - check if associative (object) or indexed (list).
				if ( $this->is_associative_array( $merged[ $key ] ) || $this->is_associative_array( $value ) ) {
					// Deep merge objects.
					$merged[ $key ] = $this->merge_properties( $merged[ $key ], $value );
				}
				else {
					// Combine arrays and get unique values.
					$merged[ $key ] = \array_values( \array_unique( \array_merge( $merged[ $key ], $value ), \SORT_REGULAR ) );
				}
			}
			// Else: entity1's value is non-empty scalar, keep it (prefer first occurrence).
		}

		return $merged;
	}

	/**
	 * Merge @type values from two entities
	 *
	 * JSON-LD allows @type to be either a string or an array of strings.
	 * This method combines types from both entities, deduplicates them,
	 * and normalizes the result (string if 1 type, array if multiple).
	 *
	 * Examples:
	 * - merge_types("Person", "Person") → "Person"
	 * - merge_types("Person", "Author") → ["Person", "Author"]
	 * - merge_types("Person", ["Author", "Employee"]) → ["Person", "Author", "Employee"]
	 * - merge_types(["Person"], "Person") → "Person"
	 * - merge_types(["Person", "Author"], ["Author", "Employee"]) → ["Person", "Author", "Employee"]
	 *
	 * @param string|array<string>|null $type1 First @type value.
	 * @param string|array<string>|null $type2 Second @type value.
	 * @return string|array<string> Merged and normalized @type value.
	 */
	private function merge_types( $type1, $type2 ) {

		$types1 = $this->normalize_type_to_array( $type1 );
		$types2 = $this->normalize_type_to_array( $type2 );

		$merged = \array_unique( \array_merge( $types1, $types2 ), \SORT_REGULAR );

		return $this->normalize_type_from_array( $merged );
	}

	/**
	 * Normalize @type value to array format
	 *
	 * @param string|array<string>|null $type Type value to normalize.
	 * @return array<string> Array of type strings.
	 */
	private function normalize_type_to_array( $type ): array {
		if ( $type === null ) {
			return [];
		}

		if ( \is_string( $type ) ) {
			return [ $type ];
		}

		if ( \is_array( $type ) ) {

			return \array_values( \array_filter( $type, 'is_string' ) );
		}

		return [];
	}

	/**
	 * Normalize array of types back to string or array.
	 *
	 * Returns string if single type, array if multiple types.
	 * This keeps the output compact while supporting multi-type entities.
	 *
	 * @param array<string> $types Array of type strings.
	 * @return string|array<string> Normalized type value.
	 */
	private function normalize_type_from_array( array $types ) {
		// Remove duplicates and re-index.
		$types = \array_values( \array_unique( $types ) );

		if ( empty( $types ) ) {
			// Fallback - should not happen in normal flow.
			return 'Thing'; // schema.org root type.
		}

		if ( \count( $types ) === 1 ) {
			return $types[0];
		}

		return $types;
	}

	/**
	 * Check if array is associative (object-like) vs indexed (list-like)
	 *
	 * @param array<string|int, string|int|bool|array<string|int|bool>> $argument Array to check.
	 * @return bool True if associative.
	 */
	private function is_associative_array( array $argument ): bool {
		if ( empty( $argument ) ) {
			return false;
		}
		return \array_keys( $argument ) !== \range( 0, ( \count( $argument ) - 1 ) );
	}
}


Current_dir [ 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ] Document_root [ 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ]


[ Back ]
𝗡𝗔𝗠𝗘
𝗦𝗜𝗭𝗘
𝗟𝗔𝗦𝗧 𝗧𝗢𝗨𝗖𝗛
𝗨𝗦𝗘𝗥
𝗦𝗧𝗔𝗧𝗨𝗦
𝗙𝗨𝗡𝗖𝗧𝗜𝗢𝗡𝗦
..
--
23 Sep 2026 4.33 AM
docteuh / users
0777
DeactivationModal
--
14 Sep 2026 3.00 PM
docteuh / users
0755
Handler
--
21 Sep 2026 11.04 PM
docteuh / users
0755
Hotel-Icon-Set-v1.0
--
16 Sep 2026 5.24 PM
docteuh / users
0755
Resources
--
13 Sep 2026 12.43 PM
docteuh / users
0755
Search_Console
--
13 Sep 2026 9.47 PM
docteuh / users
0755
apiclient-services
--
11 Sep 2026 11.41 AM
docteuh / users
0755
application
--
14 Sep 2026 3.00 PM
docteuh / users
0755
assets
--
19 Sep 2026 4.57 AM
docteuh / users
0755
capabilities
--
22 Sep 2026 9.04 PM
docteuh / users
0755
cgi-bin
--
21 Sep 2026 12.13 PM
docteuh / users
0755
chosen
--
19 Sep 2026 4.55 AM
docteuh / users
0755
codemirror
--
13 Sep 2026 3.33 PM
docteuh / users
0755
domain
--
22 Sep 2026 11.03 AM
docteuh / users
0755
dynamic
--
14 Sep 2026 12.23 AM
docteuh / users
0755
endpoints
--
14 Sep 2026 11.42 AM
docteuh / users
0755
guzzle
--
13 Sep 2026 8.48 PM
docteuh / users
0755
includes
--
13 Sep 2026 2.18 PM
docteuh / users
0755
infrastructure
--
22 Sep 2026 3.05 AM
docteuh / users
0755
main-diag-20260907032755
--
16 Sep 2026 6.42 AM
docteuh / users
0755
media
--
19 Sep 2026 4.55 AM
docteuh / users
0755
models
--
19 Sep 2026 4.55 AM
docteuh / users
0755
monolog
--
13 Sep 2026 12.12 AM
docteuh / users
0755
no-builder
--
9 Sep 2026 8.02 PM
docteuh / users
0755
ocean
--
19 Sep 2026 4.57 AM
docteuh / users
0755
open-graph
--
17 Sep 2026 3.47 PM
docteuh / users
0755
plupload
--
7 Sep 2026 11.49 AM
docteuh / users
0755
polyfill-php70
--
19 Sep 2026 2.30 AM
docteuh / users
0755
serverhttpson
--
12 Sep 2026 3.27 PM
docteuh / users
0755
src
--
13 Sep 2026 10.54 AM
docteuh / users
0755
thickbox
--
29 Aug 2026 9.39 AM
docteuh / users
0755
tool
--
21 Sep 2026 5.41 PM
docteuh / users
0755
user-interface
--
19 Sep 2026 4.37 AM
docteuh / users
0755
widgets
--
13 Sep 2026 3.29 PM
docteuh / users
0755
wpautoresize
--
11 Sep 2026 5.33 PM
docteuh / users
0755
_variables.scss
2.563 KB
21 May 2026 2.34 PM
docteuh / users
0644
animations.css
1.422 KB
18 Jun 2026 6.25 PM
docteuh / users
0644
breadcrumbs-generator.php
12.619 KB
23 Jun 2026 6.19 PM
docteuh / users
0644
cleanup-repository.php
1.302 KB
23 Jun 2026 6.19 PM
docteuh / users
0644
icon-redirect-manager-20260827192224.svg
1.299 KB
23 Jun 2026 6.19 PM
docteuh / users
0644
icon-redirect-manager-20260828040443.svg
1.299 KB
23 Jun 2026 6.19 PM
docteuh / users
0644
icon-redirect-manager-20260828104450.svg
1.299 KB
23 Jun 2026 6.19 PM
docteuh / users
0644
icon-redirect-manager-20260828142807.svg
1.299 KB
23 Jun 2026 6.19 PM
docteuh / users
0644
icon-redirect-manager.svg
1.299 KB
23 Jun 2026 6.19 PM
docteuh / users
0644
imgedit-icons-2x.png
7.484 KB
28 Oct 2014 11.02 PM
docteuh / users
0644
loader.php
6.886 KB
23 Jun 2026 6.19 PM
docteuh / users
0644
my-sites.php
4.718 KB
21 May 2026 2.34 PM
docteuh / users
0644
properties-merger.php
5.118 KB
23 Jun 2026 6.19 PM
docteuh / users
0644
wordpress-seo-de_DE-8c2f72a2c46baea606be9a7b0c1a23d8.json
0.589 KB
5 Jul 2026 11.44 PM
docteuh / users
0644
wordpress-seo-de_DE-a35a702af4a7fbb6d2d4db8c193dd940.json
0.821 KB
5 Jul 2026 11.44 PM
docteuh / users
0644
wordpress-seo-de_DE-fbf6c210cf52f9eaaf78c5f02b58c276.json
5.426 KB
5 Jul 2026 11.44 PM
docteuh / users
0644
wordpress-seo-es_ES-a35a702af4a7fbb6d2d4db8c193dd940.json
0.902 KB
10 Jun 2026 6.21 PM
docteuh / users
0644
wordpress-seo-es_ES-fbf6c210cf52f9eaaf78c5f02b58c276.json
5.581 KB
10 Jun 2026 6.21 PM
docteuh / users
0644
wordpress-seo-fr_FR-a35a702af4a7fbb6d2d4db8c193dd940.json
0.869 KB
15 Jun 2026 6.40 AM
docteuh / users
0644
wordpress-seo-fr_FR-fbf6c210cf52f9eaaf78c5f02b58c276.json
6.148 KB
15 Jun 2026 6.40 AM
docteuh / users
0644
wordpress-seo-it_IT-8c2f72a2c46baea606be9a7b0c1a23d8.json
0.547 KB
2 Jun 2026 6.21 PM
docteuh / users
0644
wordpress-seo-it_IT-a35a702af4a7fbb6d2d4db8c193dd940.json
0.815 KB
2 Jun 2026 6.21 PM
docteuh / users
0644
wordpress-seo-it_IT-fbf6c210cf52f9eaaf78c5f02b58c276.json
5.623 KB
2 Jun 2026 6.21 PM
docteuh / users
0644
wordpress-seo-nl_NL-8c2f72a2c46baea606be9a7b0c1a23d8.json
0.563 KB
10 Jun 2026 6.21 PM
docteuh / users
0644
wordpress-seo-nl_NL-a35a702af4a7fbb6d2d4db8c193dd940.json
0.797 KB
10 Jun 2026 6.21 PM
docteuh / users
0644
wordpress-seo-nl_NL-fbf6c210cf52f9eaaf78c5f02b58c276.json
5.14 KB
10 Jun 2026 6.21 PM
docteuh / users
0644
wordpress-urls.php
0.982 KB
23 Jun 2026 6.19 PM
docteuh / users
0644

✘✘ GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME ✘✘
Static GIF Static GIF