WP_Theme_JSON::remove_keys_not_in_schema( array $tree, array $schema ): array

Given a tree, removes the keys that are not present in the schema.

Description

It is recursive and modifies the input in-place.

Parameters

$treearrayrequired
Input to process.
$schemaarrayrequired
Schema to adhere to.

Return

array The modified $tree.

Source

protected static function remove_keys_not_in_schema( $tree, $schema ) {
	if ( ! is_array( $tree ) ) {
		return $tree;
	}

	foreach ( $tree as $key => $value ) {
		// Remove keys not in the schema or with null/empty values.
		if ( ! array_key_exists( $key, $schema ) ) {
			unset( $tree[ $key ] );
			continue;
		}

		// Validate type if schema specifies a boolean marker.
		if ( is_bool( $schema[ $key ] ) ) {
			// Schema expects a boolean value - validate the input matches.
			if ( ! is_bool( $value ) ) {
				unset( $tree[ $key ] );
				continue;
			}
			// Type matches, keep the value and continue to next key.
			continue;
		}

		if ( is_array( $schema[ $key ] ) ) {
			if ( ! is_array( $value ) ) {
				unset( $tree[ $key ] );
			} elseif ( wp_is_numeric_array( $value ) ) {
				// If indexed, process each item in the array.
				foreach ( $value as $item_key => $item_value ) {
					if ( isset( $schema[ $key ][0] ) && is_array( $schema[ $key ][0] ) ) {
						$tree[ $key ][ $item_key ] = self::remove_keys_not_in_schema( $item_value, $schema[ $key ][0] );
					} else {
						// If the schema does not define a further structure, keep the value as is.
						$tree[ $key ][ $item_key ] = $item_value;
					}
				}
			} else {
				// If associative, process as a single object.
				$tree[ $key ] = self::remove_keys_not_in_schema( $value, $schema[ $key ] );

				if ( empty( $tree[ $key ] ) ) {
					unset( $tree[ $key ] );
				}
			}
		}
	}
	return $tree;
}

Changelog

VersionDescription
7.0.0Added type validation for boolean values.
5.8.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.