value. We will only go one level deep. * * For example, given the following array: * array( array( 'two' => 'value1' ), array( 'two' => 'value2' ) ) * you can search for the key of the subarray containing the 'two' key with the 'value2', that is 1 * * @param array $array The array in which to search * @param string $key The key to search for * @param mixed $value The value to search for * * @return mixed|false */ public static function findSubarrayByKeyValue( $array, $key, $value ) { // Bail if it's not array if ( ! is_array( $array ) ) { return false; } foreach ( $array as $k => $v ) { if ( isset( $v[ $key ] ) && $value == $v[ $key ] ) { return $k; } } return false; } /** * Search an array of objects for a certain property value and return the index where it was found. * * @param array $array * @param string $property * @param mixed $value * * @return int|string|false */ public static function objArraySearch( $array, $property, $value ) { foreach ( $array as $key => $array_inf ) { if ( property_exists( $array_inf, $property ) && $array_inf->{$property} == $value ) { return $key; } } return false; } /** * Get the difference between two associative arrays, recursively. * * @link http://be2.php.net/manual/en/function.array-diff-assoc.php#114297 * * @param array $array1 * @param array $array2 * * @return bool|array */ public static function arrayDiffAssocRecursive( $array1, $array2 ) { foreach ( $array1 as $key => $value ) { if ( is_array( $value ) ) { if ( ! isset( $array2[ $key ] ) ) { $difference[ $key ] = $value; } elseif ( ! is_array( $array2[ $key ] ) ) { $difference[ $key ] = $value; } else { $new_diff = self::arrayDiffAssocRecursive( $value, $array2[ $key ] ); if ( false !== $new_diff ) { $difference[ $key ] = $new_diff; } } } elseif ( ! array_key_exists( $key, $array2 ) || $array2[ $key ] != $value ) { $difference[ $key ] = $value; } } return ! isset( $difference ) ? false : $difference; } /** * Searches for an array entry that partially matches the needle and returns the first found key * * @param string $needle * @param array $haystack * * @return bool|int|string The first key whose value matched the partial needle. False on failure or invalid input. */ public static function strArraySearch( $needle, $haystack ) { if ( empty( $haystack ) ) { return false; } if ( ! is_array( $haystack ) ) { return false; } foreach ( $haystack as $key => $value ) { if ( ! is_string( $value ) ) { return false; } if ( false !== strpos( $value, $needle ) ) { return $key; } } return false; } /** * Searches in reverse order for an array entry that partially matches the needle and returns the first found key * * @param string $needle * @param array $haystack * * @return bool|int|string The first key whose value matched the partial needle. False on failure or invalid input. */ public static function strrArraySearch( $needle, $haystack ) { if ( empty( $haystack ) ) { return false; } if ( ! is_array( $haystack ) ) { return false; } $haystack = array_reverse( $haystack, true ); foreach ( $haystack as $key => $value ) { if ( ! is_string( $value ) ) { return false; } if ( false !== strpos( $value, $needle ) ) { return $key; } } return false; } /** * Detaches a specified item from an array and returns that item. * * @param array $array The array from which you want to detach an item (by reference). * @param mixed $key The key to detach and return. * * @return mixed|false Returns the key that was detached, or false if no key was found. */ public static function detach( array &$array, $key ) { if ( ! array_key_exists( $key, $array ) ) { return false; } $value = $array[ $key ]; unset( $array[ $key ] ); return $value; } /** * Detaches a specified item from an array by value and returns that item. * * @param array $array The array from which you want to detach an item (by reference). * @param mixed $value The value to find, detach, and return. * * @return mixed|false */ public static function detach_by_value( array &$array, $value ) { $key = array_search( $value, $array ); if ( ! $key ) { return false; } return self::detach( $array, $key ); } /** * Moves an item from one position in an array to another position in the array. * * @param $array * @param $old_index * @param $new_index * * @return mixed */ public static function reorder( $array, $old_index, $new_index ) { array_splice( $array, $new_index, count( $array ), array_merge( array_splice( $array, $old_index, 1 ), array_slice( $array, $new_index, count( $array ) ) ) ); return $array; } /** * Marge arrays recursively and distinct * * Merges any number of arrays / parameters recursively, replacing * entries with string keys with values from latter arrays. * If the entry or the next value to be assigned is an array, then it * automagically treats both arguments as an array. * Numeric entries are appended, not replaced, but only if they are * unique * * @param array $base Initial array to merge. * @param array ... Variable list of arrays to recursively merge. * * @return array * * @link http://www.php.net/manual/en/function.array-merge-recursive.php#96201 * @author Mark Roduner */ public static function array_merge_recursive_distinct() { $arrays = func_get_args(); $base = array_shift( $arrays ); if ( ! is_array( $base ) ) { $base = empty( $base ) ? array() : array( $base ); } foreach ( $arrays as $append ) { if ( ! is_array( $append ) ) { $append = array( $append ); } foreach ( $append as $key => $value ) { if ( ! array_key_exists( $key, $base ) && ! is_numeric( $key ) ) { $base[ $key ] = $append[ $key ]; continue; } if ( is_array( $value ) || ( array_key_exists( $key, $base ) && is_array( $base[ $key ] ) ) ) { if ( ! isset( $base[ $key ] ) ) { $base[ $key ] = array(); } $base[ $key ] = self::array_merge_recursive_distinct( $base[ $key ], $append[ $key ] ); } else if ( is_numeric( $key ) ) { if ( ! in_array( $value, $base ) ) { $base[] = $value; } } else { $base[ $key ] = $value; } } } return $base; } /** * Orders an associative array by several keys values, each with its own order. * * See array_multisort() for flags. * * Taken from here: http://docs.php.net/manual/en/function.array-multisort.php#100534 * * @return array */ public static function array_orderby() { $args = func_get_args(); $data = array_shift( $args ); foreach ( $args as $n => $field ) { if ( is_string( $field ) ) { $tmp = array(); foreach ( $data as $key => $row ) { $tmp[ $key ] = $row[ $field ]; } $args[ $n ] = $tmp; } } $args[] = &$data; call_user_func_array( 'array_multisort', $args ); return array_pop( $args ); } } }