<?php namespace MetaBox\Support; class Arr { /** * New array map function that accepts more params than just values. * Params: array|item, callback, other params. */ public static function map() { $args = func_get_args(); $items = array_shift( $args ); $callback = array_shift( $args ); if ( ! is_array( $items ) ) { array_unshift( $args, $items ); return call_user_func_array( $callback, $args ); } return array_map( function( $item ) use ( $callback, $args ) { array_unshift( $args, $item ); return call_user_func_array( $callback, $args ); }, $items ); } /** * Convert a comma separated string to array. * * @param array|string $csv Comma separated string. */ public static function from_csv( $csv ) : array { return is_array( $csv ) ? $csv : array_filter( array_map( 'trim', explode( ',', $csv . ',' ) ) ); } /** * Change array key. * * @param array $array Input array. * @param string $from From key. * @param string $to To key. */ public static function change_key( &$array, $from, $to ) { if ( isset( $array[ $from ] ) ) { $array[ $to ] = $array[ $from ]; } unset( $array[ $from ] ); } /** * Ensure a variable is an array. */ public static function ensure( $input ) : array { return (array) $input; } /** * Flatten an array. * @link https://stackoverflow.com/a/1320156/371240 */ public static function flatten( array $array ) : array { $return = []; array_walk_recursive( $array, function( $a ) use ( &$return ) { $return[] = $a; } ); return $return; } /** * Convert flatten collection (with dot notation) to multiple dimensional array * * @param collection $collection Collection to be flatten. * @return array */ public static function unflatten( $collection ) { $collection = (array) $collection; $output = []; foreach ( $collection as $key => $value ) { self::set( $output, $key, $value ); if ( is_array( $value ) && ! strpos( $key, '.' ) ) { $nested = self::unflatten( $value ); $output[ $key ] = $nested; } } return $output; } /** * Set array element value with dot notation. */ public static function set( &$array, $key, $value ) { if ( is_null( $key ) ) { $array = $value; return $array; } // Do not parse email value. if ( is_email( $key ) ) { $array[ $key ] = $value; return; } $keys = explode( '.', $key ); while ( count( $keys ) > 1 ) { $key = array_shift( $keys ); // If the key doesn't exist at this depth, we will just create an empty array // to hold the next value, allowing us to create the arrays to hold final // values at the correct depth. Then we'll keep digging into the array. if ( ! isset( $array[ $key ] ) || ! is_array( $array[ $key ] ) ) { $array[ $key ] = []; } $array =& $array[ $key ]; } $array[ array_shift( $keys ) ] = $value; } /** * Get array element value with dot notation. */ public static function get( $array, $key, $default = null ) { if ( is_null( $key ) ) { return $array; } $keys = explode( '.', $key ); foreach ( $keys as $key ) { if ( isset( $array[ $key ] ) ) { $array = $array[ $key ]; } else { return $default; } } return $array; } }