JSON_NUMERIC_CHECK round-fix

Ако искате автоматично да преобразувате низове в числа при json_encode тогава един от начините е с JSON_NUMERIC_CHECK.

Но при него има доста често срещани проблеми като изрязването на телефоните и големите числа.

Това се отнася най-вече за запазени в някакъв обект, база от данни, или други които са пресметнати и са представени в консистентен формат. Например: при запазване на числата +123, 0123, 123 винаги ще се запазят като 123. Когато взимаме тези данни ние знаем, че подадените ни данни ще са вече изчислени, обработени и +123 не може да срещнем ако числото наистина не е низ от символи.

Ето една реализация на същата функционалност както при JSON_NUMERIC_CHECK, която не създава такива проблеми. Числата се заменят само ако не са толкова големи и ако не започват с „+“ или „0“ (т.е. са изчислени числа).


Опростената версия на кода:

function stringToNumeric(&$element)
{
    if(is_string($element) && is_numeric($element)) {
        //Check if normal int or float and change format
        if (ctype_digit($element) && strval(intval($element)) === $element) {
            $element = intval($element);
        } elseif(strval(doubleval($element)) === $element) {
            $element = doubleval($element);
        }
    }
}

function arrayStringsToNumeric(&$array) 
{
    array_walk_recursive($array, "stringToNumeric");
}

function jsonNumericEncode($data, $options = 0, $depth = 512)
{
    //if Has Numberic check and is_array do proper check
    if(($options & JSON_NUMERIC_CHECK) == JSON_NUMERIC_CHECK && is_array($data)) {
        //Remove numeric check
        $options = $options ^ JSON_NUMERIC_CHECK;
        //Make proper type
        array_walk_recursive($data, "stringToNumeric");
    }
    json_encode($data, $options, $depth);
}
jsonNumericEncode

Функцията замества използването на JSON_NUMERIC_CHECK, но може и да се ползва директно като премахнете тази проверка.

function prepareJsonData($data)
{
    //if Has Numberic check and is_array do proper check
    if((is_array($data) && !empty($data)) {
        //Make proper type
        array_walk_recursive($data, "stringToNumeric");
    }
}
$data = prepareJsonData($data);
json_encode($data);

Така накрая в данните може да получите

{
    "phone": "+525526262",
    "number: 12512521, 
    "phone2": "0025542424252",
    "money": 22.23
}

вместо

{
    "phone": 525526262,
    "number: 12512521, 
    "phone2": 25542424252,
    "money": 22.23
}

Има и друго решение, което според мен не е толкова ефективно. Можете да продължите с използването на JSON_NUMERIC_CHECK, но да промените малко данните за да се запазят все пак като низ от символи:

function prepareJsonWithNumberCheck(&$data) {
array_walk_recursive($data, function(&$element) {
    //Check if big int or number and add space
    $same = strval(intval($element)) == $element;
    if (ctype_digit($element) && !$same) {
        $element = "" . $element . " ";
    } elseif(!$same && !preg_match('/^(\+|0)[0-9]+$/', $element)) {
        $element = "" . $element . " ";
    }
});
}

, , ,

Няма коментари

Разделяне на локация в 2 отделни полета

Разделяне на локация в 2 отделни полета
от 22.33,21.33 в полетата latitude и longitude

update users_profiles set latitude = cast(SUBSTRING_INDEX(`location`, ',', 1) as decimal(10, 4)), longitude = cast(SUBSTRING_INDEX(location, ',', -1) as decimal(10, 4));

Няма коментари

Bootstrap качване на файл

bootstrap-file-upload-inputДобре изглеждаща форма за качване на файлове.

Ако знаете синтаксиса на Bootstrap може лесно да се промени и да се ползва без бутона за изпращане.

<input type="file" name="excel" id="input_file" style="display:none;" />
<div class="input-group col-sm-4 pull-right">
 <span class="input-group-btn">
     <button class="btn btn-default" id="select_button" type="button">Select...</button>
 </span>
 <input type="text" name="text-excel" readonly="" id="submit_file" class="form-control">
 <span class="input-group-btn">
     <input type="submit" name="upload" value="Import" class="btn btn-primary">
 </span>
</div>
<script>
    $('#input_file').change(function(){
        $('#submit_file').val($(this).val().replace(/C:\\fakepath\\/i, ''));
    });
    $('#select_button').click(function(){
        $('#input_file').click();
    });
</script>

, ,

Няма коментари

Активна навигация

Ако имате статична или динамична навигация, много пъти при изкарването и в нов файл трябва да се предвиди как ще се проверява дали линка трябва да е активен за текущата страница.

Вместо да добавям някакъв сложен код към навигацията съм разработил проста функция, която просто трябва да се извика с името на линка.


Простата версия на кода:

function active ($find, $exact = FALSE)
{
	if ( $exact ) {
		$server = explode('/', $_SERVER['REQUEST_URI']);
		$uri = $server[count($server) - 1];
		if ( strcmp($uri, $find) == 0 ) {
			return 'class="active"';
		}
	} else if ( strpos($_SERVER['REQUEST_URI'], $find) !== FALSE ) {
		return 'class="active"';
	}

    return "";
}

Сложната, която работи с масив:

function active ($find, $exact = FALSE)
{
    if(is_array($find)) {
        $server = explode('/', $_SERVER['REQUEST_URI']);
        if(!empty($find))
            foreach($find as $element) {
                if ( $exact ) {
                    $uri = $server[count($server) - 1];
                    if ( strcmp($uri, $element) == 0 ) {
                        return 'class="active"';
                    }
                } else if ( strpos($_SERVER['REQUEST_URI'], $element) !== FALSE ) {
                    return 'class="active"';
                }
            }
    } else {
        if ( $exact ) {
            $server = explode('/', $_SERVER['REQUEST_URI']);
            $uri = $server[count($server) - 1];
            if ( strcmp($uri, $find) == 0 ) {
                return 'class="active"';
            }
        } else if ( strpos($_SERVER['REQUEST_URI'], $find) !== FALSE ) {
            return 'class="active"';
        }
    }

    return "";
}

Ако при линковете има други класове, може да се замени ‘class=“active“‘ с „active“.

Пример за използване:


Няма коментари

Проверка за съществуване на Google Play Services – Android

Проверка дали Google Play Services е достъпно.
Лесно може да проверите дали може да извикате карта, GPS локация или някаква друга функционалност от Google Play Services

/**
 * Check if Google Play services is available before making a request.
 *
 * @return true if Google Play services is available, otherwise false
 */
protected boolean googleServicesExist() {

    // Check that Google Play services is available
    int resultCode =
            GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

    // If Google Play services is available
    if (ConnectionResult.SUCCESS == resultCode) {
        return true;
    // Google Play services was not available for some reason
    } else {
        return false;
    }
}

Няма коментари

  • Страница 1 от 9
  • 1
  • 2
  • 3
  • 4
  • ...
  • 9
  • >