Для получения полного доступа
зарегистрируйтесь.

Nepster    151   28 916

Открыт к предложениям по работе

****Тут может быть Ваша реклама...

  • Одесса
  • html5, css3, less, javascript, jquery, php, mysql
  • Маркетинг, WEB-дизайн
  • Зарегистрирован 4 года назад
$str = '0123456789 abcdKDLAD !@#$%^&*()_+ абвгЖЗИКМ chỉđơngiảnlà 是印刷及排版';
$result = preg_replace('#(*UTF8)[^\pL\pN\s]+#u','', $str);
echo $result; // 0123456789 abcdKDLAD  абвгЖЗИКМ chỉđơngiảnlà 是印刷及排版

Так-же можно удалять и пробелы убрав метасимвол \s.

GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор.

function guid() {
  function s4() {
    return Math.floor((1 + Math.random()) * 0x10000)
      .toString(16)
      .substring(1);
  }
  return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
  	s4() + '-' + s4() + s4() + s4();
}

Результат: 9e24e277-8524-812a-9c3f-4930444d74de

Для мотивации =).

if (version_compare(phpversion(), '5.6.0', '<')) {
    exit("It's Time To Move Forward. PHP7 already stable! Minimum use PHP 5.6." . PHP_EOL);
}

Первый символ заглавный, с поддержкой utf-8

  function my_ucfirst($string, $e ='utf-8') {
        if (function_exists('mb_strtoupper') && function_exists('mb_substr') && !empty($string)) {
            $string = mb_strtolower($string, $e);
            $upper = mb_strtoupper($string, $e);
            preg_match('#(.)#us', $upper, $matches);
            $string = $matches[1] . mb_substr($string, 1, mb_strlen($string, $e), $e);
        } else {
            $string = ucfirst($string);
        }
        return $string;
    } 

Bootstrap 3 модальное окно по центру.

.modal {
  text-align: center;
}

@media screen and (min-width: 768px) { 
  .modal:before {
    display: inline-block;
    vertical-align: middle;
    content: " ";
    height: 100%;
  }
}

.modal-dialog {
  display: inline-block;
  text-align: left;
  vertical-align: middle;
}

Сортировка массива по определенному ключу. Поддерживает ассоциацию индексов. Пример от наших зарубежных коллег: http://php.net/manual/ru/function.sort.php#99419

function array_sort($array, $on, $order = SORT_ASC)
{
    $new_array = [];
    $sortable_array = [];

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
                break;
            case SORT_DESC:
                arsort($sortable_array);
                break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

Иногда бывает необходимо запустить событие только 1 раз после всех действий. Один из распространенных примеров это resize.

var waitForFinalEvent = (function () {
  var timers = {};
  return function (callback, ms, uniqueId) {
    if (!uniqueId) {
      uniqueId = "Don't call this twice without a uniqueId";
    }
    if (timers[uniqueId]) {
      clearTimeout (timers[uniqueId]);
    }
    timers[uniqueId] = setTimeout(callback, ms);
  };
})();


$(window).resize(function () {
    waitForFinalEvent(function(){
      alert('Resize...');
      //...
    }, 500, "some unique string");
});
Сниппет,  PHP

Nested Sets to array

Работаю с вложенными деревьями, а именно Nested Sets и как раз потребовалась функция, которая собирает из полученных узлов массив со вложенностями.

function toHierarchy($collection)
{
    // Trees mapped
    $trees = [];
    $l = 0;

    if (count($collection) > 0) {
        // Node Stack. Used to help building the hierarchy
        $stack = [];

        foreach ($collection as $node) {
            $item = $node;
            $item['children'] = [];

            // Number of stack items
            $l = count($stack);

            // Check if we're dealing with different levels
            while($l > 0 && $stack[$l - 1]['depth'] >= $item['depth']) {
                array_pop($stack);
                $l--;
            }

            // Stack is empty (we are inspecting the root)
            if ($l == 0) {
                // Assigning the root node
                $i = count($trees);
                $trees[$i] = $item;
                $stack[] = & $trees[$i];
            } else {
                // Add node to parent
                $i = count($stack[$l - 1]['children']);
                $stack[$l - 1]['children'][$i] = $item;
                $stack[] = & $stack[$l - 1]['children'][$i];
            }
        }
    }

    return $trees;
}

Ограничение на ввод символов в текстовом поле.

    $("input[type='number']").on('keyup keypress blur change', function(e) {
        //return false if not 0-9
        if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
            return false;
        }else{
            //limit length but allow backspace so that you can still delete the numbers.
            if( $(this).val().length >= parseInt($(this).attr('maxlength')) && (e.which != 8 && e.which != 0)){
                return false;
            }
        }
    });

Запрещает ввод всех символов кроме чисел в текстовое поле.

    $("input[type='number']").keydown(function (e) {
        // Allow: backspace, delete, tab, escape, enter and .
        if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 ||
                // Allow: Ctrl+A
            (e.keyCode == 65 && e.ctrlKey === true) ||
                // Allow: Ctrl+C
            (e.keyCode == 67 && e.ctrlKey === true) ||
                // Allow: Ctrl+X
            (e.keyCode == 88 && e.ctrlKey === true) ||
                // Allow: home, end, left, right
            (e.keyCode >= 35 && e.keyCode <= 39)) {
            // let it happen, don't do anything
            return;
        }
        // Ensure that it is a number and stop the keypress
        if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
            e.preventDefault();
        }
    });

К примеру необходимо найти все файлы с расширением .png в одной папке и скопировать их в другую.

find /home/user/images/ -name '*.png' -exec cp {} /home/user/png  \;

Очень быстрый пример от наших зарубежных коллег http://stackoverflow.com/questions/2524151/php-get-all-subdirectories-of-a-given-directory, как можно обойти все вложенные директории и получить их список.

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/home/nepster/www/test.ru'),
    RecursiveIteratorIterator::SELF_FIRST
);

foreach ($iterator as $file) {
    if ($file->isDir()) {
        echo $file->getRealpath(), PHP_EOL;
    }
}

В php есть команда mkdir, с помощью которой можно указать права на папку. Однако не всегда этого достаточно, сценарий может плеваться, на то что у него нет доступа, хотя права 0777 были выставлены.

В этом случае можно воспользоваться umask

$imagePath = '/path/to/images';
if (!is_dir($imagePath)) {
    $old_umask = umask(0);
    if (!mkdir($imagePath, 0777, true)) {
    	return false;
    }
    umask($old_umask);
}

Кстати по задачам на собеседованиях.

Необходимо реализовать, чтобы echo $b->$$$b выдало 10 
// Реализация 1 (Алексей Уколов)
class Foo {
  public $deepest = 10;
  
  public function __toString()
  {
    return 'deep';
  }
}

$deeper = 'deepest';
$deep = 'deeper';
$b = new Foo();

echo $b->$$$b;

// Реализация 2 (kirill-93)
class B {
    public $b = 10;

    public function __toString() {
        return "b";
    }
}

$b = new B();
echo $b->$$$b;

Думаю эту команду можно выполнить на любом языке программирования.

Например на php: exec('wget -r -k -l 7 -p -E -nc http://site.com/');

Описание: -r — указывает на то, что нужно рекурсивно переходить по ссылкам на сайте, чтобы скачивать страницы. -k — используется для того, чтобы wget преобразовал все ссылки в скаченных файлах таким образом, чтобы по ним можно было переходить на локальном компьютере (в автономном режиме). -p — указывает на то, что нужно загрузить все файлы, которые требуются для отображения страниц (изображения, css и т.д.). -l — определяет максимальную глубину вложенности страниц, которые wget должен скачать (по умолчанию значение равно 5, в примере мы установили 7). В большинстве случаев сайты имеют страницы с большой степенью вложенности и wget может просто «закопаться», скачивая новые страницы. Чтобы этого не произошло можно использовать параметр -l. -E — добавлять к загруженным файлам расширение .html. -nc — при использовании данного параметра существующие файлы не будут перезаписаны. Это удобно, когда нужно продолжить загрузку сайта, прерванную в предыдущий раз.

wget -r -k -l 7 -p -E -nc http://site.com/
$foo and $this->bar(); // вызывается $this->bar(), если $foo имеет значение true
$bar or $this->foo(); // вызывается $this->foo(), когда $bar имеет значение false

Удалить повторяющиеся значения из многомерного массива

// 1 вложенность 
$array = array_map("unserialize", array_unique(array_map("serialize", $array)));

// Рекурсивно
function super_unique($array) {
    $result = array_map("unserialize", array_unique(array_map("serialize", $array)));
    foreach ($result as $key => $value) {
        if ( is_array($value) ) {
        	$result[$key] = super_unique($value);
        }
    }
    return $result;
}

SQL запрос осуществляет сортировку по возрастанию и при этом нули будут в конце.

SELECT * FROM `table` ORDER BY CASE WHEN `field_name`=0 THEN 1 ELSE 0 END, `field_name`;