نسخه بهتر شده تابع parse_str در php

۱۱ ماه پیش(به روز شده در ۹ ماه پیش) پی اچ پی(PHP)(توابع) ۰

در تابع ()parse_str تبدیل آرایه ها بدرستی انجام نمیشود به همین خاطر نیاز هست تا تابع قدرتمندتری استفاده نمود. تابع معرفی شده بصورت کامل یک رشته کوئری ورودی را به متغیرها و آرایه ها تبدیل میکند و به نوعی نسخه پیشرفته تر تابع پیشفرض php است.

function betterParseStr( $string )
{
    return array_reduce( explode( "&", $string ), function( $array, $string_piece ) {
        if( $string_piece === "" ) return $array;
        $equal_offset = strpos( $string_piece, "=" );
        if( $equal_offset === FALSE ) {
            $key = urldecode( $string_piece );
            $value = "";
        } else {
            $key = urldecode( substr( $string_piece, 0, $equal_offset ) );
            $value = urldecode( substr( $string_piece, $equal_offset + 1 ) );
        }
        if( preg_match( "/^([^\[]*)\[([^\]]*)](.*)$/", $key, $matches ) ) {
            $key_path = array( $matches[1], $matches[2] );
            $rest = $matches[3];
            while( preg_match( "/^\[([^\]]*)](.*)$/", $rest, $matches ) ) {
                $key_path[] = $matches[1];
                $rest = $matches[2];
            }
        } else {
            //replace first [ for _
            //why?!? idk ask PHP it does
            //Example: ?key[[=value -> array( "key_[" => "value" )
            $key_path = array( preg_replace('/\[/', '_', $key, 1 ) );
        }
        if( strlen( $key_path[0] ) > 0 && substr( $key_path[0], 0, 1 ) !== "[" ) {
            $current_node = &$array;
            $last_key = array_pop( $key_path );
            $resolve_key = function( $key, array $array ) {
                if( $key === "" || $key === " " ) {
                    $int_array = array_filter( array_keys( $array ), function( $key ) { return is_int( $key ); } );
                    $key = $int_array ? max( $int_array ) + 1 : 0;
                }
                return $key;
            };
            foreach( $key_path as $key_path_piece ) {
                $key_path_piece = $resolve_key( $key_path_piece, $current_node );
                if( ! array_key_exists( $key_path_piece, $current_node ) || ! is_array( $current_node[$key_path_piece] ) ) {
                    $current_node[$key_path_piece] = array();
                }
                $current_node = &$current_node[$key_path_piece];
            }
            $current_node[$resolve_key( $last_key, $current_node )] = $value;
        }
        return $array;
    }, array() );
}

منبع

برچسبها

parsestr php betterParseStr

صفحات پیشنهادی

نمایش آرایه به صورت درخت...

تابع print_r برای نمایش متغیر مخصوصا آرایه ها بسیار پر کاربرد است و قطعا برنامه نویسان php بارها با آن برخورد داشته اند. در این مطلب تابعی معرفی می گردد که آرایه ها را بر خلاف تابع print_r بصورت درخت ...

تابع کنترل اطلاعات ورودی برای جلوگیری از تزریق به پایگاه داده...

ورودی‌ها همیشه باید کنترل شوند تا از خطراتی نظیر SQL Injection در امان بود. یک روش ساده و قوی برای این کار وجود دارد که خود وب سایت PHP آنرا توصیه نموده است. هر چند که شما می ...

نمایش آی‌پی کاربر در شرایط مختلف...

این تابع ip کاربر را در شرایط مختلف بر می گرداند. function get_ip() { $list = array( 'REMOTE_ADDR', 'CLIENT_IP', 'HTTP_CLIENT_IP', 'HTTP_PROXY_CONNECTION', 'HTTP_FORWARDED', 'HTT...

جدا سازی سه رقمی اعداد جهت خوانایی بهتر با تابع numberformat...

در php تابعی با نام number_format جهت جدا سازی سه رقمی اعداد وجود دارد ، اما با این وجود برای آموزش و جلوگیری از خطا بدلیل پشتیبانی نشدن در نسخه های مختلف php این تابع را معرفی می کنیم که به شرح زیر ا...

نظر

نظری ثبت نشده است.
captcha image reload