Простой шаблонизатор, когда такие монстры как Twig избыточные
class Templater {
/** @var array Данные для шаблона */
public $data = [];
/** @var string Путь к шаблону */
public $templatePath = "";
public function render(){
ob_start();
ob_implicit_flush(false);
if ($this->data) extract($this->data);
require($this->templatePath);
return ob_get_clean();
}
}
Очень быстрый пример от наших зарубежных коллег 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;
}
}
Простая функция для определения AJAX запроса на PHP.
<?php
function request_is_ajax()
{
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}
Компонент для расширенной работы с ВК API в YII2. Загрузка изображений, распознавание капчи, постановка очередей и многое другое.
Сайт с подробным описанием yii2 api vk GitHub
Такой подход к записи используется в моей библиотеке Sitemap для генерации огромных карт сайтов, содержащих сотни тысяч URL.
// пишем данные в буфер чтобы не дёргать диск слишком часто
$bufferSize = 1000;
$filePath = 'test.xml';
$writer = new XMLWriter();
// для буфера используем память
$writer->openMemory();
$writer->startDocument('1.0', 'UTF-8');
$writer->setIndent(true);
$writer->startElement('test');
while ($i < 10000) {
if ($i % $bufferSize) {
// если буфер полон, скидываем его в файл
file_put_contents($filePath, $writer->flush(true), FILE_APPEND);
}
$writer->writeElement('item', $i);
}
$this->writer->endElement();
$this->writer->endDocument();
// пишет остаток буфера в файл
file_put_contents($filePath, $writer->flush(true), FILE_APPEND);
Удалить повторяющиеся значения из многомерного массива
// 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;
}
Пройтись по массиву циклом, но последний элемент обработать особенным образом. Задачка типичная, решений много. Одно из лучших в то же время является одним из простейших.
$last = array_pop($array);
foreach ($array as $value) {
// делаем что-либо с каждым элементом
}
// делаем что-либо с последним элементом $last
Видел вот такой подход: http://gostash.it/ru/stashes/232 И нашел альтернативу чуть по проще.
list($a, $b) = [$b, $a];
Несмотря на то, что затея сама по себе довольно бессмысленна, можно использовать анонимные функции для обработки URL и полностью выкинуть MVC примерно так же, как это рекламируют популярные микрофреймворки.
require 'vendor/autoload.php';
require 'vendor/yiisoft/yii2/Yii.php';
$app = new CallbackWebApplication([
'id' => 'MyApplication',
'basePath' => __DIR__,
'components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
],
],
]);
$app->onGet('hello/<name>', function($name) {
return 'Hello, ' . $name . '!';
});
$app->run();
<?php
class CallbackWebApplication extends \yii\web\Application
{
private $callbacks = [];
/**
* @inheritdoc
*/
public function handleRequest($request)
{
list ($route, $params) = $request->resolve();
if (preg_match('~callbacks/(\d+)~', $route, $matches) && isset($this->callbacks[$matches[1]])) {
$result = call_user_func_array($this->callbacks[$matches[1]], $params);
} else {
throw new \yii\web\NotFoundHttpException();
}
$response = $this->getResponse();
$response->data = $result;
return $response;
}
public function onGet($pattern, callable $callback)
{
// можно реализовать через свой UrlRule,
// но было очень лениво
$callbackIndex = count($this->callbacks);
$this->callbacks[$callbackIndex] = $callback;
Yii::$app->getUrlManager()->addRules([
$pattern => 'callbacks/' . $callbackIndex
]);
}
}