{$key_or_property}, $default_value ); } else { return fw_akg( $keys, $array_or_object[ $key_or_property ], $default_value ); } } else { if ( $is_object ) { return $array_or_object->{$key_or_property}; } else { return $array_or_object[ $key_or_property ]; } } } /** * Set (or create if not exists) value for specified key in some array level * * @param string $keys 'a/b/c', or 'a/b/c/' equivalent to: $arr['a']['b']['c'][] = $val; * @param mixed $value * @param array|object $array_or_object * @param string $keys_delimiter * * @return array|object */ function fw_aks( $keys, $value, &$array_or_object, $keys_delimiter = '/' ) { if ( ! is_array( $keys ) ) { $keys = explode( $keys_delimiter, (string) $keys ); } $key_or_property = array_shift( $keys ); if ( $key_or_property === null ) { return $array_or_object; } $is_object = is_object( $array_or_object ); if ( $is_object ) { if ( ! property_exists( $array_or_object, $key_or_property ) || ! ( is_array( $array_or_object->{$key_or_property} ) || is_object( $array_or_object->{$key_or_property} ) ) ) { if ( $key_or_property === '' ) { // this happens when use 'empty keys' like: abc/d/e////i/j//foo/ trigger_error( 'Cannot push value to object like in array ($arr[] = $val)', E_USER_WARNING ); } else { $array_or_object->{$key_or_property} = array(); } } } else { if ( ! is_array( $array_or_object ) ) { $array_or_object = array(); } if ( ! array_key_exists( $key_or_property, $array_or_object ) || ! is_array( $array_or_object[ $key_or_property ] ) ) { if ( $key_or_property === '' ) { // this happens when use 'empty keys' like: abc.d.e....i.j..foo. $array_or_object[] = array(); // get auto created key (last) end( $array_or_object ); $key_or_property = key( $array_or_object ); } else { $array_or_object[ $key_or_property ] = array(); } } } if ( isset( $keys[0] ) ) { // not used count() for performance reasons if ( $is_object ) { fw_aks( $keys, $value, $array_or_object->{$key_or_property} ); } else { fw_aks( $keys, $value, $array_or_object[ $key_or_property ] ); } } else { if ( $is_object ) { $array_or_object->{$key_or_property} = $value; } else { $array_or_object[ $key_or_property ] = $value; } } return $array_or_object; } /** * Unset specified key in some array level * * @param string $keys 'a/b/c' -> unset($arr['a']['b']['c']); * @param array|object $array_or_object * @param string $keys_delimiter * * @return array|object */ function fw_aku( $keys, &$array_or_object, $keys_delimiter = '/' ) { if ( ! is_array( $keys ) ) { $keys = explode( $keys_delimiter, (string) $keys ); } $key_or_property = array_shift( $keys ); if ( $key_or_property === null || $key_or_property === '' ) { return $array_or_object; } $is_object = is_object( $array_or_object ); if ( $is_object ) { if ( ! property_exists( $array_or_object, $key_or_property ) ) { return $array_or_object; } } else { if ( ! is_array( $array_or_object ) || ! array_key_exists( $key_or_property, $array_or_object ) ) { return $array_or_object; } } if ( isset( $keys[0] ) ) { // not used count() for performance reasons if ( $is_object ) { fw_aku( $keys, $array_or_object->{$key_or_property} ); } else { fw_aku( $keys, $array_or_object[ $key_or_property ] ); } } else { if ( $is_object ) { unset( $array_or_object->{$key_or_property} ); } else { unset( $array_or_object[ $key_or_property ] ); } } return $array_or_object; } /** * Generate random unique md5 */ function fw_rand_md5() { return md5( time() . '-' . uniqid( rand(), true ) . '-' . mt_rand( 1, 1000 ) ); } function fw_unique_increment() { static $i = 0; return ++ $i; } /** * print_r() alternative * * @param mixed $value Value to debug */ function fw_print( $value ) { static $first_time = true; if ( $first_time ) { ob_start(); echo ''; echo str_replace( array( ' ', "\n" ), '', ob_get_clean() ); $first_time = false; } if ( func_num_args() == 1 ) { echo '
'; echo fw_htmlspecialchars( FW_Dumper::dump( $value ) ); echo '