WP_List_Util{} WP 4.7.0

Службовий клас із методами-утилітами для роботи з масивами та об’єктами. Допомагає сортувати та фільтрувати масиви.

Основа для:
wp_list_sort()

Хуків немає.

Повертає

Нічого.

Використання

$Util = New WP_List_Util($input);
// Далі використання необхідного методу
$input
(масив) (обов’язковий)
Масив над з яким працюватимемо.

Властивості класу

$input
(масив) (private)
Масив із вхідними даними.
$output
(масив) (private)
Масив з даними, що повертаються.
$orderby
(масив) (private)
Тимчасові аргументи сортування.

Методи класу

  1. public __construct( $input )
  2. public get_input()
  3. public get_output()
  4. public pluck( $field, $index_key = null )
  5. public sort_callback( $a, $b )
__construct( $input )
(public)
Приймає масив даних і поміщає їх у властивість
$input.
get_input()
(public)
Повертає оригінальний (вхідний) масив.
get_output()
(public)
Повертає оброблений (вихідний) масив.
filter( $args = array(), $operator = ‘AND’ )
(public)
Фільтрує список на основі набору аргументів
key => value . Використовується у функціях
wp_list_filter() та
wp_filter_object_list() .
pluck( $field, $index_key = null )
(public)
Виймає певне поле з кожного об’єкта у списку. Повний опис роботи методу читайте у функції
wp_list_pluck() . Також використовується функції
wp_filter_object_list() .
sort( $orderby = array(), $order = ‘ASC’, $preserve_keys = false )
(public)
Сортує список на основі одного або кількох аргументів
orderby . Повний опис методу читайте у функції
wp_list_sort() .
sort_callback( $a, $b )
(private)
Функція зворотного дзвінка для сортування списку на певні поля. Повертає 0, якщо обидва об’єкти рівні. -1, якщо другий об’єкт повинен бути першим, 1 інакше.

Приклади

0

#1 Приклад використання класу

Подивимося код функції wp_list_pluck() :

function wp_list_pluck( $list, $field, $index_key = null ) {
	$util = new WP_List_Util( $list );

	return $util->pluck($field, $index_key);
}
0

#2 Створимо свою функцію сортування

Для цього використовуємо клас WP_List_Util{}:

function sort_array_by_order( $array ) {

	$util = new WP_List_Util($array);

	// залишимо тільки елементи, де є поле order
	$array = $util->filter(['order' => true]);

	// відсортуємо
	return $util->sort( 'order', 'ASC', true );
}

список змін

З версії 4.7.0Введено.

Код WP_List_Util{} WP 6.0.2

class WP_List_Util {
	/**
	 * The input array.
	 *
	 * @ Since 4.7.0
	 * @var array
	 */
	private $input = array();

	/**
	 * The output array.
	 *
	 * @ Since 4.7.0
	 * @var array
	 */
	private $output = array();

	/**
	 * Temporary arguments for sorting.
	 *
	 * @ Since 4.7.0
	 * @var string[]
	 */
	private $orderby = array();

	/**
	 * Constructor.
	 *
	 * Sets the input array.
	 *
	 * @ Since 4.7.0
	 *
	 * @param array $input Array для виконання операцій на.
	 */
	public function __construct( $input ) {
		$this->output = $input;
		$this->input = $input;
	}

	/**
	 * Returns the original input array.
	 *
	 * @ Since 4.7.0
	 *
	 * @return array The input array.
	 */
	public function get_input() {
		return $this->input;
	}

	/**
	 * Returns the output array.
	 *
	 * @ Since 4.7.0
	 *
	 * @return array The output array.
	 */
	public function get_output() {
		return $this->output;
	}

	/**
	 * Filters the list, заснований на наборі key => value arguments.
	 *
	 * Retrieves the objects from the list that match the given arguments.
	 * Key represents property name, and value represents property value.
	 *
	 * If an object has more properties than those specified in arguments,
	 * that will not disqualify it. When using the 'AND' operator,
	 * any missing properties will disqualify it.
	 *
	 * @ Since 4.7.0
	 *
	 * @param array $args Optional. array of key => value arguments to match
	 * Після кожного об'єкта. Default empty array.
	 * @param string $operator Optional. Logical operation to perform. 'AND' means
	 * all elements from the array must match. 'OR' means only
	 * one element needs to match. 'NOT' means no elements may
	 * Match. Default 'AND'.
	 * @return array Array of found values.
	 */
	public function filter( $args = array(), $operator = 'AND' ) {
		if ( empty( $args ) ) {
			return $this->output;
		}

		$ operator = strtoupper ($ operator);

		if ( ! in_array( $operator, array( 'AND', 'OR', 'NOT' ), true ) ) {
			$this->output = array();
			return $this->output;
		}

		$ count = count ($ args);
		$filtered = array();

		foreach ( $this->output as $key => $obj ) {
			$ matched = 0;

			foreach ( $args as $m_key => $m_value ) {
				if ( is_array( $obj ) ) {
					// Treat object as an array.
					if ( array_key_exists( $m_key, $obj ) && ( $m_value == $obj[ $m_key ] ) ) {
						$ matched ++;
					}
				} elseif ( is_object ( $ obj ) ) {
					// Treat object as an object.
					if ( isset( $obj->{$m_key} ) && ( $m_value == $obj->{$m_key} ) ) {
						$ matched ++;
					}
				}
			}

			if ( ( 'AND' === $operator && $matched === $count )
				|| ( 'OR' === $operator && $matched > 0 )
				|| ( 'NOT' === $operator && 0 === $matched )
			) {
				$filtered[ $key ] = $obj;
			}
		}

		$this->output = $filtered;

		return $this->output;
	}

	/**
	 * Plucks a certain field out of each element in the input array.
	 *
	 * Це має таку функціональність і prototype of
	 * array_column() (PHP 5.5) but also supports objects.
	 *
	 * @ Since 4.7.0
	 *
	 * @param int|string $field Field to fetch from the object or array.
	 * @param int|string $index_key Optional. Field from the element to use as keys for the new array.
	 * Default null.
	 * @return array Array of found values. If `$index_key` is set, array of found values ​​with keys
	 * corresponding to `$index_key`. If `$index_key` є null, array keys from the original
	 * `$list` will be preserved in the results.
	 */
	public function pluck( $field, $index_key = null ) {
		$newlist = array();

		if ( ! $index_key ) {
			/*
			 * This is simple. Could at some point wrap array_column()
			 * if we knew we had an array of arrays.
			 */
			foreach ( $this->output as $key => $value ) {
				if ( is_object( $value ) ) {
					$newlist[ $key ] = $value->$field;
				} else {
					$newlist[ $key ] = $value[ $field ];
				}
			}

			$this->output = $newlist;

			return $this->output;
		}

		/*
		 * Якщо index_key is not set for a particular item, push the value
		 * to the end of the stack. This is how array_column() behaves.
		 */
		foreach ( $this->output as $value ) {
			if ( is_object( $value ) ) {
				if ( isset( $value->$index_key ) ) {
					$newlist[ $value->$index_key ] = $value->$field;
				} else {
					$newlist[] = $value->$field;
				}
			} else {
				if ( isset ( $ value [ $ index_key ] ) ) {
					$newlist[ $value[ $index_key ] ] = $value[ $field ];
				} else {
					$newlist[] = $value[ $field ];
				}
			}
		}

		$this->output = $newlist;

		return $this->output;
	}

	/**
	 * Sorts the input array базується на одному або більше orderby arguments.
	 *
	 * @ Since 4.7.0
	 *
	 * @param string|array $orderby Optional. Either the field name до order by or an array
	 * of multiple orderby fields as $orderby => $order.
	 * @param string $order Optional. Either 'ASC' або 'DESC'. Тільки використовувалися якщо $orderby
	 * is a string.
	 * @param bool $preserve_keys Optional. Всі, щоб передати keys. Default false.
	 * @return array The sorted array.
	 */
	public function sort( $orderby = array(), $order = 'ASC', $preserve_keys = false ) {
		if (empty($orderby)) {
			return $this->output;
		}

		if ( is_string( $orderby ) ) {
			$ orderby = array ($ orderby => $ order);
		}

		foreach ( $orderby as $field => $direction ) {
			$orderby[ $field ] = 'DESC' === strtoupper( $direction ) ? 'DESC' : 'ASC';
		}

		$this->orderby = $orderby;

		if ( $preserve_keys ) {
			uasort( $this->output, array( $this, 'sort_callback' ) );
		} else {
			usort( $this->output, array( $this, 'sort_callback' ) );
		}

		$this->orderby = array();

		return $this->output;
	}

	/**
	 * Callback to sort an array by specific fields.
	 *
	 * @ Since 4.7.0
	 *
	 * @see WP_List_Util::sort()
	 *
	 * @param object|array $a One object to compare.
	 * @param object|array $b Інший об'єкт до compare.
	 * @return int 0 if both objects equal. -1 if second object should come first, 1 otherwise.
	 */
	private function sort_callback( $a, $b ) {
		if ( empty( $this->orderby ) ) {
			return 0;
		}

		$a = (array) $a;
		$ b = (array) $ b;

		foreach ( $this->orderby as $field => $direction ) {
			if ( ! isset ( $ a [ $ field ] ) | | ! isset ( $ b [ $ field ] ) ) {
				continue;
			}

			if ( $a[ $field ] == $b[ $field ] ) {
				continue;
			}

			$results = 'DESC' === $direction ? array(1, -1): array(-1, 1);

			if ( is_numeric( $a[ $field ] ) && is_numeric( $b[ $field ] ) ) {
				return ($a[$field]<$b[$field])? $results[0] : $results[1];
			}

			return 0 > strcmp( $a[ $field ], $b[ $field ] ) ? $results[0] : $results[1];
		}

		return 0;
	}
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *