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

Kosuha606    11   14 551


Программист-фанатик, люблю разные языки и красивые реализации внезависимости от автора.

  • Курск
  • Сам по себе
  • В основном веб языки, а вообще полиглот!
  • КЭМТ, Среднее образ., ЮЗГУ Вышка не закончил
  • Зарегистрирован 4 года назад

Даже в коде Yii2 в yii/db/Query, где обработка indexBy идет индексация перебором rows в цикле, хотя есть способ использовать array_column для индексации массива по ключу. пример:

$users = [
    ['id' => 1, 'name' => 'Bob', 'age' => 30],
    ['id' => 12, 'name' => 'Alice', 'age' => 20],
    ['id' => 34, 'name' => 'Trump', 'age' => 69]
];

$users = array_column($users, null, 'id');
 
// В результате
$users = [
    1 => ['id' => 1, 'name' => 'Bob', 'age' => 30],
    12 => ['id' => 12, 'name' => 'Alice', 'age' => 20],
    34 => ['id' => 34, 'name' => 'Trump', 'age' => 69]
];

Так же точно в качестве аналога ArrayHelper::map из Yii2 можно использовать этот же array_column

$users = [
    ['id' => 1, 'name' => 'Bob', 'age' => 30],
    ['id' => 12, 'name' => 'Alice', 'age' => 20],
    ['id' => 34, 'name' => 'Trump', 'age' => 69]
];

$users = array_column($users, 'id', 'name');
 
// В результате
$users = [
    1 => 'Bob',
    12 => 'Alice',
    34 => 'Trump'
];

Функция, позволяющая перевести PhpOffice Spreadsheet в таблицу PhpWord Table, Чтобы напечатать таблицу в .doc файле. Пришлось сделать эту функцию, потому что перевод XLS->HTML и HTML->DOC работает плохо для таблиц.

Из недочетов метода:

  1. addCell - использует константую ширину ячейки, это можно доработать
  2. Объединение ячеек учитывается только по ширине, не по высоте.

Делал этот метод для того, чтобы основная логика генерации таблиц была в XLS и чтобы генерация DOC использовала эту таблицу уже готовую и вставляла таблицу в заготовленный шаблон DOC.

private function convertXlsToDocTable(Worksheet $sheet, Table $table)
{
    foreach ($sheet->getRowIterator() as $rowIndex => $row) {
        $table->addRow();
        $prevMergeRange = null;
        $cellIterator = $row->getCellIterator();
        $cellIterator->setIterateOnlyExistingCells(false);
        foreach ($cellIterator as $cellIndex => $cell) {
            $value = $cell->getValue();
            $mergeRange = $cell->getMergeRange();
            if ($mergeRange && $prevMergeRange == $mergeRange) {
                continue;
            }
            if ($mergeRange) {
                $mergeCount = 0;
                foreach ($row as $mergeCell) {
                    if ($mergeRange == $mergeCell['mergeRange']) {
                        $mergeCount++;
                    }
                }
                $table->addCell(2000, ['gridSpan' => $mergeCount])->addText($value);
                $prevMergeRange = $mergeRange;
            } else {
                $table->addCell(2000, [])->addText($value);
            }
        }
    }

    return $table;
}

Простая функция, которая переберет в цикле нужные вам для проверки свойства CSS и проверит поддерживает ли их браузер.

function checkCssSupport(containerSelector) {
    var supportValues = [
        {
            feature: "display",
            value  : "flex",
        }
    ], supportIndex, curFeature,
       curValue, notSupportedClass;
    for (supportIndex in supportValues) {
        curFeature = supportValues[supportIndex].feature;
        curValue   = supportValues[supportIndex].value;
        notSupportedClass = 'no-' + curValue + '-support';
        $(containerSelector).addClass(notSupportedClass);
        if (typeof(CSS) !== 'undefined') {
            if (CSS.supports(curFeature, curValue)) {
                $(containerSelector).removeClass(notSupportedClass);
            }
        }
    }
}

Продолжение »

Простой класс, который будет определять принадлежит ли свойство у которого есть определенная форма написания определенному контракту (интерфейсу/классу).

Для надежности можно нужное свойство, у которого должен быть определенный контракт можно закрыть модификатором доступа protected, хотя врядли вы станете обращаться к такому монстро-свойству.

Для проверки контрактов всех свойств нужно вызвать метод check, может быть было бы и не плохо реализовать метод проверки одного конкретного свойства.

Код:

<?php
class Foo extends ContractsChecker {
    protected $separator = 'Contracted';
    protected $FooContractContractedProperty;
}

Продолжение »

К сожалению не нашел в списке языков elisp, поэтому пришлось поставить clojure. В последнее время увлекаюсь lisp и решил на реальной задаче попробовать свои силы, получилось вот это.

Эти функции в совокупности автоматически подставляют префиксы вендоров в весь файл CSS при этом вы можете сами задать какие свойства нужно заменять, сейчас идет поиск только свойства border-radius, соответственно все свойства вроде -moz-border-radius не будут затронуты этим генератором, только оригинальное.

Я понимаю, что у вендоров есть специфичные реализации свойств тот же border-radius если использовать top-left и т.п. может иметь разный синтаксис, но эта проблема может быть решена с помощью хэш таблиц для выполнения подстановки вместо обычного списка в функции resolve-css-name.

Тестировал на файле в 5000 строк и вся подстановка прошла быстро, не больше 1 секунды, но выравнивание всего файла заняло тоже около 1 секунды.

(defun auto-prefixy (p)
  "p - Точка на которой произошел запуск функции.
Функция для автоматического подставления
Префиксов на весь файл стилей"
  (interactive "p")
  (save-excursion
	(let ((string (buffer-substring-no-properties (point-min) (point-max)))
		  (list-strings)
		  (value)
		  (result-string))
	  (setq list-strings (split-string string "\n"))
	  (dolist (element list-strings value)
		(setq element (trim-string element))
		(if (resolve-css-name element)
			(setq result-string (concat result-string (add-prefixies element) "\n"))
		  (setq result-string (concat result-string element "\n"))))
	  (delete-region (point-min) (point-max))
	  (insert result-string)
	  (indent-region (point-min) (point-max)))))     

Продолжение »

Этот класс можно использовать в случаях, когда необходимо заставить барузеры клиентов обновить ресурсы ( css, js ) при их изменении в git. Требует доступного на выполнение git.

Этот пример оптимизирован по совету пользователя matweew. Улучшенную версию смотрите ниже после этой.

Первая версия:

<?php

class HashedAsset
{
    public $hash;
    
    public function init()
    {
        exec('git describe --always',$version_hash);
        if (isset($version_hash[0])) {
            $this->hash = md5($version_hash[0]);    
        }
    }
}

Продолжение »

Небольшая функция для определения нужно ли подсветить какой-нибудь пункт меню как активный в зависимости от текущего url. Применимо к ЧПУ ссылкам, для запросов с параметрами придется доработать.

Продолжение »

У меня на работе появилась задачка сделать небольшой проект, для простого просмотра картинок из папок локальной сети.. И как то так само собой сложилось, что я написал вот такой класс для рендеринга видов ( просто я люблю Yii2 да и вообще MVC ). Вот решил поделиться и спросить у занющих людей насколько рабочим в реальных проектах был бы этот класс??? Возможно ли решить задачу по другому?? Просто это первое что пришло в голову и есть сомнения в качестве...

Реализацию yii2 рендеринга не смотрел, так как само как то получилось... но посмотрю как нибудь обязательно...

Еще дополню, в проекте не использовался вообще никакой фреймворк... просто приложение на PHP.

Продолжение »

Этот класс предназначен для выполнения пересчета позиций в каком-либо списке.

Таких примеров, у меня, возникает очень много. Допустим в интерфейсе нужно вывести таблицу продуктов, из которой пользователь должен выбрать нужное количество для выполнения каких - либо операций, и после подтверждения своих действий пользователь должен увидеть измененную таблицу, в которой из поля общего количества уже вычтено значение, которое указал пользователь.

Конечно вычесть одно значение из второго - не проблема, но когда необходимо расширить функционал и добавить еще какие-нибудь расчеты, то начинаешь жалеть, что использовал простые вычисления вместо хорошей абcтракции.

interface PositionContract {
    public function getName();
    public function getTotal();
    public function getProcessed();
}

class PositionRecounter {
    protected $positions = [];
    
    public function add(PositionContract $position) {
        array_push($this->positions, $position);
    }
    
    public function getCalculation() {
        $rows = [];        
        foreach($this->positions as $position) {
            array_push($rows, [
                'name'     => $position->getName(),
                'total'    => $position->getTotal(),
                'processed'=> $position->getProcessed(),
                'rest'     => $position->getTotal()-$position->getProcessed()
            ]);
        }
        return $rows;
    }
}

class Position implements PositionContract {
    private $total;
    private $processed;
    private $name;    
    
    public function __construct($name, $total, $processed) {
        $this->total = $total;
        $this->processed = $processed;
        $this->name = $name;
    }
    // Реализацию get методов опущу, там просто возвращение соотв. свойств
}
// Использование клиентом
$recounter = new PositionRecounter();
$recounter->add(new Position('Пирожок',1000,100));
$recounter->add(new Position('Ватрушка',500,250));
var_dump($recounter->getCalculation());

Данная функция рассчитает сколько осталось времени между двумя датами или двумя значениями времени, плюс можно передать формат вывода результата, по-умолчанию "H:i:s".

Если первая дата оказалась меньше второй, значит между двумя датами не осталось времени, и функция вернет false.

function elapsedTime(
	\DateTime $from ,
    \DateTime $to ,
    $format = "%H:%i:%s"
) {
    if ( $from < $to ) return false;    
    return $from->diff( $to )->format( $format );
}