Перенес функции в класс
This commit is contained in:
parent
5e1362d103
commit
5e6d39d638
8 changed files with 488 additions and 491 deletions
|
|
@ -1,8 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once __DIR__ . '/../functions.php';
|
|
||||||
|
|
||||||
|
|
||||||
function forceUrl($name)
|
function forceUrl($name)
|
||||||
{
|
{
|
||||||
if (is_callable($name)) {
|
if (is_callable($name)) {
|
||||||
|
|
@ -213,7 +210,7 @@ class Controller_Action
|
||||||
/*.Filter_ActionAccess.*/$access = $this->access;
|
/*.Filter_ActionAccess.*/$access = $this->access;
|
||||||
|
|
||||||
if ($access == null || $access->checkAction($name)) {
|
if ($access == null || $access->checkAction($name)) {
|
||||||
return lcurry(array($this, 'postUrl'), $name, $param);
|
return Functions::lcurry(array($this, 'postUrl'), $name, $param);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
380
src/Functions.php
Normal file
380
src/Functions.php
Normal file
|
|
@ -0,0 +1,380 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Функциональное программирование в PHP
|
||||||
|
* package functional
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Эмуляция каррированой функции
|
||||||
|
*/
|
||||||
|
class __right {
|
||||||
|
protected $params;
|
||||||
|
protected $fn;
|
||||||
|
|
||||||
|
public function __construct($params) {
|
||||||
|
$this->fn = array_shift($params);
|
||||||
|
$this->params = $params;
|
||||||
|
}
|
||||||
|
|
||||||
|
function apply() {
|
||||||
|
$params = func_get_args();
|
||||||
|
array_splice($params, count($params), 0, $this->params);
|
||||||
|
return call_user_func_array($this->fn, $params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class __left {
|
||||||
|
protected $params;
|
||||||
|
protected $fn;
|
||||||
|
|
||||||
|
public function __construct($params) {
|
||||||
|
$this->fn = array_shift($params);
|
||||||
|
$this->params = $params;
|
||||||
|
}
|
||||||
|
|
||||||
|
function apply() {
|
||||||
|
$params = func_get_args();
|
||||||
|
array_splice ($params, 0, 0, $this->params);
|
||||||
|
return call_user_func_array ($this->fn, $params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
define('__', '_ARGUMENT_PLACE_');
|
||||||
|
class __partial {
|
||||||
|
protected $params;
|
||||||
|
protected $fn;
|
||||||
|
|
||||||
|
public function __construct($params) {
|
||||||
|
$this->fn = array_shift($params);
|
||||||
|
$this->params = $params;
|
||||||
|
}
|
||||||
|
|
||||||
|
function apply() {
|
||||||
|
$params = func_get_args();
|
||||||
|
$result = array();
|
||||||
|
for($i = 0, $j = 0; $i < count($this->params); $i++) {
|
||||||
|
if ($this->params[$i] == __) {
|
||||||
|
$result [] = $params[$j];
|
||||||
|
$j++;
|
||||||
|
} else {
|
||||||
|
$result [] = $this->params[$i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return call_user_func_array ($this->fn, $result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Композиция функций
|
||||||
|
*/
|
||||||
|
class __compose {
|
||||||
|
protected $fns;
|
||||||
|
function __construct($list) {
|
||||||
|
$this->fns = array_reverse($list);
|
||||||
|
}
|
||||||
|
|
||||||
|
function apply () {
|
||||||
|
$params = func_get_args ();
|
||||||
|
$result = call_user_func_array($this->fns[0], $params);
|
||||||
|
for ($i = 1; $i < count($this->fns); $i++) {
|
||||||
|
$result = call_user_func($this->fns[$i], $result);
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Functions {
|
||||||
|
|
||||||
|
static function partial() {
|
||||||
|
$closure = new __partial(func_get_args());
|
||||||
|
return array($closure, 'apply');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Композиция функций
|
||||||
|
* @param mixed $a
|
||||||
|
* @param mixed $b
|
||||||
|
*
|
||||||
|
* @return array[int]mixed
|
||||||
|
*/
|
||||||
|
static function compose() {
|
||||||
|
$closure = new __compose(func_get_args());
|
||||||
|
return array($closure, 'apply');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Карирование справа
|
||||||
|
*
|
||||||
|
* @return array[int]mixed
|
||||||
|
*/
|
||||||
|
static function rcurry($_rest) {
|
||||||
|
$closure = new __right(func_get_args ());
|
||||||
|
return array($closure, 'apply');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Карирование слева
|
||||||
|
*
|
||||||
|
* @return array[int]mixed
|
||||||
|
*/
|
||||||
|
static function lcurry($_rest) {
|
||||||
|
$closure = new __left(func_get_args ());
|
||||||
|
return array($closure, 'apply');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Разделение массива на два по условию
|
||||||
|
* @param mixed $pred Условие по которому разделяется массив
|
||||||
|
* @param array $lst
|
||||||
|
*
|
||||||
|
* @return array[int]mixed
|
||||||
|
*/
|
||||||
|
static function partition($pred, $lst) {
|
||||||
|
$left = array ();
|
||||||
|
$right = array ();
|
||||||
|
foreach ($lst as $n) {
|
||||||
|
if (call_user_func($pred, $n) !== false) {
|
||||||
|
$left [] = $n;
|
||||||
|
} else {
|
||||||
|
$right [] = $n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array ($left, $right);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $value
|
||||||
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
static function __key($value, $name) {
|
||||||
|
return $value[$name];
|
||||||
|
}
|
||||||
|
|
||||||
|
static function identity($value) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $a
|
||||||
|
* @param array $b
|
||||||
|
* @param $key
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
static function __cmp($a, $b, $key) {
|
||||||
|
if ($a[$key] == $b[$key]) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ($a[$key] > $b[$key]) ? -1 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function __cmp_less($a, $b, $key) {
|
||||||
|
if ($a[$key] == $b[$key]) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ($a[$key] < $b[$key]) ? -1 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Сравнение по ключу массиве
|
||||||
|
static function __index($n, $key, $row) {
|
||||||
|
return ($row[$key] == $n);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function __div($x, $y) {
|
||||||
|
return $x / $y;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function __self($name, $o) {
|
||||||
|
return call_user_func(array($o, $name));
|
||||||
|
}
|
||||||
|
|
||||||
|
static function concat(/* $args ...*/) {
|
||||||
|
$args = func_get_args();
|
||||||
|
return implode("", $args);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function __empty($x) {
|
||||||
|
return empty($x);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Отрицание
|
||||||
|
static function __not($x) {
|
||||||
|
return !$x;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Не равно
|
||||||
|
static function __neq($x, $y) {
|
||||||
|
return $x != $y;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Равно
|
||||||
|
static function __eq($x, $y) {
|
||||||
|
return $x == $y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Извлекает из многомерого массива значения с определенным ключом
|
||||||
|
* @example key_values('a', array(1 => array('a' => 1, 'b' => 2))) => array(1)
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
static function key_values($key, /*array|ArrayIterator*/ $array) {
|
||||||
|
$result = array();
|
||||||
|
|
||||||
|
foreach($array as $item) {
|
||||||
|
$result[] = $item[$key];
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function key_values_object($key, /*array|ArrayIterator*/ $array) {
|
||||||
|
$result = array();
|
||||||
|
|
||||||
|
foreach($array as $item) {
|
||||||
|
$result[] = $item->{$key};
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function assoc_key_values($key, $value, $array) {
|
||||||
|
$result = array();
|
||||||
|
foreach ($array as $item) {
|
||||||
|
$result[$item[$key]] = $item[$value];
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function assoc_key($key, $array) {
|
||||||
|
$result = array();
|
||||||
|
foreach ($array as $item) {
|
||||||
|
$result[$item[$key]] = $item;
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function _get($key, /*.any.*/$value, /*.array.*/$array) {
|
||||||
|
foreach ($array as $item) {
|
||||||
|
if ($item[$key] == $value) return $item;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function _get_key($key, $value, $array) {
|
||||||
|
foreach ($array as $name => $item) {
|
||||||
|
if ($item[$key] == $value) return $name;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Логическа операция && ко всем элементам массива
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
static function every(array $array, $callback) {
|
||||||
|
foreach ($array as $value) {
|
||||||
|
if (call_user_func($callback, $value) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Логическа операция || ко всем элементам массива
|
||||||
|
* @param array $array
|
||||||
|
* @param mixed $callback
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
static function some(array $array, $callback) {
|
||||||
|
assert(is_callable($callback));
|
||||||
|
|
||||||
|
foreach ($array as $key => $value) {
|
||||||
|
if (call_user_func($callback, $value) === true) {
|
||||||
|
return $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function span($length, array $array) {
|
||||||
|
assert(is_int($length));
|
||||||
|
|
||||||
|
$result = array();
|
||||||
|
for($i = 0; $i < count($array); $i += $length) {
|
||||||
|
$result [] = array_slice($array, $i, $length);
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function array_ref($data, $n) {
|
||||||
|
return $data[$n];
|
||||||
|
}
|
||||||
|
|
||||||
|
static function call() {
|
||||||
|
$args = func_get_args();
|
||||||
|
$name = array_shift($args);
|
||||||
|
return call_user_func_array($name, $args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Поиск элемента в массиве
|
||||||
|
* @param function $cb сравнение с элементом массива
|
||||||
|
* @param array $hs массив в котором ищется значение
|
||||||
|
*
|
||||||
|
* @return int|string ключ найденого элемента в массиве
|
||||||
|
*/
|
||||||
|
static function array_usearch($cb, array $hs, $strict = false) {
|
||||||
|
foreach($hs as $key => $value) if (call_user_func_array($cb, array($value, $key, $strict))) return $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Выбирает все сроки из таблицы с уникальными значениями ключа
|
||||||
|
* @param $name Имя ключа
|
||||||
|
* @param $table Двухмерный массив
|
||||||
|
* @example
|
||||||
|
* key_unique_values ('name', array (array ('name' => 1), array ('name' => 2), array ('name' => 1)))
|
||||||
|
=> array (1, 2)
|
||||||
|
* @end example
|
||||||
|
*/
|
||||||
|
static function key_unique_values ($name, $table) {
|
||||||
|
// Ищем уникальные значения для заданного ключа
|
||||||
|
$keys = array ();
|
||||||
|
foreach ($table as $row) {
|
||||||
|
if (!in_array ($row[$name], $keys))
|
||||||
|
$keys[] = $row[$name];
|
||||||
|
}
|
||||||
|
return $keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Сортировка двумерного массива по заданному ключу
|
||||||
|
* @param $array Массив
|
||||||
|
* @param $key Имя ключа по значению которого будет идти сравнение
|
||||||
|
* @return Отсортированный массив
|
||||||
|
*/
|
||||||
|
static function sortOn($array, $key, $fn = '__cmp') {
|
||||||
|
usort ($array, Functions::rcurry($fn, $key));
|
||||||
|
//usort ($array, create_function ('$x,$y', 'return __cmp ($x, $y, "'.$key.'");'));
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Преобразует ключи элементов для многомерного массива
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
static function hash_key ($key_name,/*. array .*/ $array) {
|
||||||
|
$result = array();
|
||||||
|
|
||||||
|
foreach($array as $value) {
|
||||||
|
$result[$value[$key_name]] = $value;
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once __DIR__ . '/../functions.php';
|
|
||||||
// Переместить в фильтры!!
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Выбор макета страницы.
|
* Выбор макета страницы.
|
||||||
* Выбор оформления страницы осуществляется если было совпадение с каким либо условием
|
* Выбор оформления страницы осуществляется если было совпадение с каким либо условием
|
||||||
|
|
@ -22,7 +19,7 @@ class Layout_Manager extends Filter_Filter
|
||||||
*/
|
*/
|
||||||
public function addConditionGet($get, Filter_Filter $layout)
|
public function addConditionGet($get, Filter_Filter $layout)
|
||||||
{
|
{
|
||||||
$this->addCondition(rcurry(array($this, 'checkGet'), $get), $layout);
|
$this->addCondition(Functions::rcurry(array($this, 'checkGet'), $get), $layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -30,7 +27,7 @@ class Layout_Manager extends Filter_Filter
|
||||||
*/
|
*/
|
||||||
public function addConditionXHR($get, Filter_Filter $layout)
|
public function addConditionXHR($get, Filter_Filter $layout)
|
||||||
{
|
{
|
||||||
$this->addCondition(rcurry(array($this, 'checkXHR'), $get), $layout);
|
$this->addCondition(Functions::rcurry(array($this, 'checkXHR'), $get), $layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function checkGet($request, $get)
|
public function checkGet($request, $get)
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ class MailAlt
|
||||||
{
|
{
|
||||||
public $mailer;
|
public $mailer;
|
||||||
public $_notify;
|
public $_notify;
|
||||||
|
public $encoding;
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
$this->mailer = new PHPMailer();
|
$this->mailer = new PHPMailer();
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
// from creole
|
class Tools_String {
|
||||||
function strToArray($str) {
|
|
||||||
|
// from creole
|
||||||
|
static function strToArray($str) {
|
||||||
$str = substr($str, 1, -1); // remove { }
|
$str = substr($str, 1, -1); // remove { }
|
||||||
$res = array();
|
$res = array();
|
||||||
|
|
||||||
|
|
@ -33,10 +35,10 @@ function strToArray($str) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Нормализация строк на русском
|
//Нормализация строк на русском
|
||||||
function normalizeRussian($str) {
|
static function normalizeRussian($str) {
|
||||||
$result = preg_replace('/\s+/',' ', $str);
|
$result = preg_replace('/\s+/',' ', $str);
|
||||||
if (is_string($result)) {
|
if (is_string($result)) {
|
||||||
$result = trim($result); //Замена длинных пробелов на одинарные, пробелы по краям
|
$result = trim($result); //Замена длинных пробелов на одинарные, пробелы по краям
|
||||||
|
|
@ -44,41 +46,41 @@ function normalizeRussian($str) {
|
||||||
$result = preg_replace('/ё/','е', $str); //е на ё
|
$result = preg_replace('/ё/','е', $str); //е на ё
|
||||||
}
|
}
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Проверка равенства двух строк на русском языке.
|
//Проверка равенства двух строк на русском языке.
|
||||||
function equalRussianCheck($str1,$str2) {
|
static function equalRussianCheck($str1,$str2) {
|
||||||
return normalizeRussian($str1) == normalizeRussian($str2);
|
return self::normalizeRussian($str1) == self::normalizeRussian($str2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Попадает ли строка в список вариантов
|
* Попадает ли строка в список вариантов
|
||||||
* input: $str="foo1" $variants="foo1|foo2|foo3"
|
* input: $str="foo1" $variants="foo1|foo2|foo3"
|
||||||
* output: true
|
* output: true
|
||||||
* input: $str="foo" $variants="foo1|foo2|foo3"
|
* input: $str="foo" $variants="foo1|foo2|foo3"
|
||||||
* output: false
|
* output: false
|
||||||
*/
|
*/
|
||||||
function compare_string_to_variants($str, $variants){
|
static function compare_string_to_variants($str, $variants){
|
||||||
$variants_array = explode('|', $variants);
|
$variants_array = explode('|', $variants);
|
||||||
$founded = false;
|
$founded = false;
|
||||||
foreach ($variants_array as $variant) {
|
foreach ($variants_array as $variant) {
|
||||||
$founded = $founded || equalRussianCheck($variant, $str);
|
$founded = $founded || self::equalRussianCheck($variant, $str);
|
||||||
}
|
}
|
||||||
return $founded;
|
return $founded;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mb_str_split($str) {
|
static function mb_str_split($str) {
|
||||||
return preg_split('~~u', $str, null, PREG_SPLIT_NO_EMPTY);
|
return preg_split('~~u', $str, null, PREG_SPLIT_NO_EMPTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
function mb_strtr($str, $from, $to) {
|
static function mb_strtr($str, $from, $to) {
|
||||||
return str_replace(mb_str_split($from), mb_str_split($to), $str);
|
return str_replace(self::mb_str_split($from), self::mb_str_split($to), $str);
|
||||||
}
|
}
|
||||||
|
|
||||||
function encodestring($st) {
|
static function encodestring($st) {
|
||||||
$st = mb_strtr($st,"абвгдеёзийклмнопрстуфхъыэ !+-()", "abvgdeeziyklmnoprstufh_ie______");
|
$st = self::mb_strtr($st,"абвгдеёзийклмнопрстуфхъыэ !+-()", "abvgdeeziyklmnoprstufh_ie______");
|
||||||
$st = mb_strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ", "ABVGDEEZIYKLMNOPRSTUFH_IE");
|
$st = self::mb_strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ", "ABVGDEEZIYKLMNOPRSTUFH_IE");
|
||||||
$st = strtr($st, array(
|
$st = strtr($st, array(
|
||||||
" " => '_',
|
" " => '_',
|
||||||
"." => '_',
|
"." => '_',
|
||||||
|
|
@ -99,9 +101,10 @@ function encodestring($st) {
|
||||||
"№"=>"N"
|
"№"=>"N"
|
||||||
));
|
));
|
||||||
return strtolower($st);
|
return strtolower($st);
|
||||||
}
|
}
|
||||||
|
|
||||||
function validate_encoded_string($st) {
|
static function validate_encoded_string($st) {
|
||||||
$enc_st = encodestring($st);
|
$enc_st = self::encodestring($st);
|
||||||
return preg_match('/^[\w_-]+(\.[\w_-]+)?$/', $enc_st);
|
return preg_match('/^[\w_-]+(\.[\w_-]+)?$/', $enc_st);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ class Validator_Validator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function skip($rule, $container) // -> Rule_Abstract
|
public function skip(/*.Validator_Rule_Abstract.*/$rule, /*.Collection.*/$container) // -> Rule_Abstract
|
||||||
{
|
{
|
||||||
if ($rule->skipEmpty()) {
|
if ($rule->skipEmpty()) {
|
||||||
$data = $container->get($rule->field);
|
$data = $container->get($rule->field);
|
||||||
|
|
|
||||||
|
|
@ -1,378 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Функциональное программирование в PHP
|
|
||||||
* package functional
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Эмуляция каррированой функции
|
|
||||||
*/
|
|
||||||
class __right {
|
|
||||||
protected $params;
|
|
||||||
protected $fn;
|
|
||||||
|
|
||||||
public function __construct($params) {
|
|
||||||
$this->fn = array_shift($params);
|
|
||||||
$this->params = $params;
|
|
||||||
}
|
|
||||||
|
|
||||||
function apply() {
|
|
||||||
$params = func_get_args();
|
|
||||||
array_splice($params, count($params), 0, $this->params);
|
|
||||||
return call_user_func_array($this->fn, $params);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class __left {
|
|
||||||
protected $params;
|
|
||||||
protected $fn;
|
|
||||||
|
|
||||||
public function __construct($params) {
|
|
||||||
$this->fn = array_shift($params);
|
|
||||||
$this->params = $params;
|
|
||||||
}
|
|
||||||
|
|
||||||
function apply() {
|
|
||||||
$params = func_get_args();
|
|
||||||
array_splice ($params, 0, 0, $this->params);
|
|
||||||
return call_user_func_array ($this->fn, $params);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
define('__', '_ARGUMENT_PLACE_');
|
|
||||||
class __partial {
|
|
||||||
protected $params;
|
|
||||||
protected $fn;
|
|
||||||
|
|
||||||
public function __construct($params) {
|
|
||||||
$this->fn = array_shift($params);
|
|
||||||
$this->params = $params;
|
|
||||||
}
|
|
||||||
|
|
||||||
function apply() {
|
|
||||||
$params = func_get_args();
|
|
||||||
$result = array();
|
|
||||||
for($i = 0, $j = 0; $i < count($this->params); $i++) {
|
|
||||||
if ($this->params[$i] == __) {
|
|
||||||
$result [] = $params[$j];
|
|
||||||
$j++;
|
|
||||||
} else {
|
|
||||||
$result [] = $this->params[$i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return call_user_func_array ($this->fn, $result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function partial() {
|
|
||||||
$closure = new __partial(func_get_args());
|
|
||||||
return array($closure, 'apply');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Композиция функций
|
|
||||||
*/
|
|
||||||
class __compose {
|
|
||||||
protected $fns;
|
|
||||||
function __construct($list) {
|
|
||||||
$this->fns = array_reverse($list);
|
|
||||||
}
|
|
||||||
|
|
||||||
function apply () {
|
|
||||||
$params = func_get_args ();
|
|
||||||
$result = call_user_func_array($this->fns[0], $params);
|
|
||||||
for ($i = 1; $i < count($this->fns); $i++) {
|
|
||||||
$result = call_user_func($this->fns[$i], $result);
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Композиция функций
|
|
||||||
* @param mixed $a
|
|
||||||
* @param mixed $b
|
|
||||||
*
|
|
||||||
* @return array[int]mixed
|
|
||||||
*/
|
|
||||||
function compose() {
|
|
||||||
$closure = new __compose(func_get_args());
|
|
||||||
return array($closure, 'apply');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Карирование справа
|
|
||||||
*
|
|
||||||
* @return array[int]mixed
|
|
||||||
*/
|
|
||||||
function rcurry($_rest) {
|
|
||||||
$closure = new __right(func_get_args ());
|
|
||||||
return array($closure, 'apply');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Карирование слева
|
|
||||||
*
|
|
||||||
* @return array[int]mixed
|
|
||||||
*/
|
|
||||||
function lcurry($_rest) {
|
|
||||||
$closure = new __left(func_get_args ());
|
|
||||||
return array($closure, 'apply');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Разделение массива на два по условию
|
|
||||||
* @param mixed $pred Условие по которому разделяется массив
|
|
||||||
* @param array $lst
|
|
||||||
*
|
|
||||||
* @return array[int]mixed
|
|
||||||
*/
|
|
||||||
function partition($pred, $lst) {
|
|
||||||
$left = array ();
|
|
||||||
$right = array ();
|
|
||||||
foreach ($lst as $n) {
|
|
||||||
if (call_user_func($pred, $n) !== false) {
|
|
||||||
$left [] = $n;
|
|
||||||
} else {
|
|
||||||
$right [] = $n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return array ($left, $right);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $value
|
|
||||||
* @param string $name
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
function __key($value, $name) {
|
|
||||||
return $value[$name];
|
|
||||||
}
|
|
||||||
|
|
||||||
function identity($value) {
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $a
|
|
||||||
* @param array $b
|
|
||||||
* @param $key
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
function __cmp($a, $b, $key) {
|
|
||||||
if ($a[$key] == $b[$key]) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return ($a[$key] > $b[$key]) ? -1 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function __cmp_less($a, $b, $key) {
|
|
||||||
if ($a[$key] == $b[$key]) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return ($a[$key] < $b[$key]) ? -1 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Сравнение по ключу массиве
|
|
||||||
function __index($n, $key, $row) {
|
|
||||||
return ($row[$key] == $n);
|
|
||||||
}
|
|
||||||
|
|
||||||
function __div($x, $y) {
|
|
||||||
return $x / $y;
|
|
||||||
}
|
|
||||||
|
|
||||||
function __self($name, $o) {
|
|
||||||
return call_user_func(array($o, $name));
|
|
||||||
}
|
|
||||||
|
|
||||||
function concat(/* $args ...*/) {
|
|
||||||
$args = func_get_args();
|
|
||||||
return implode("", $args);
|
|
||||||
}
|
|
||||||
|
|
||||||
function __empty($x) {
|
|
||||||
return empty($x);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Отрицание
|
|
||||||
function __not($x) {
|
|
||||||
return !$x;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Не равно
|
|
||||||
function __neq($x, $y) {
|
|
||||||
return $x != $y;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Равно
|
|
||||||
function __eq($x, $y) {
|
|
||||||
return $x == $y;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Извлекает из многомерого массива значения с определенным ключом
|
|
||||||
* @example key_values('a', array(1 => array('a' => 1, 'b' => 2))) => array(1)
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
function key_values($key, /*array|ArrayIterator*/ $array) {
|
|
||||||
$result = array();
|
|
||||||
|
|
||||||
foreach($array as $item) {
|
|
||||||
$result[] = $item[$key];
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function key_values_object($key, /*array|ArrayIterator*/ $array) {
|
|
||||||
$result = array();
|
|
||||||
|
|
||||||
foreach($array as $item) {
|
|
||||||
$result[] = $item->{$key};
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function assoc_key_values($key, $value, $array) {
|
|
||||||
$result = array();
|
|
||||||
foreach ($array as $item) {
|
|
||||||
$result[$item[$key]] = $item[$value];
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function assoc_key($key, $array) {
|
|
||||||
$result = array();
|
|
||||||
foreach ($array as $item) {
|
|
||||||
$result[$item[$key]] = $item;
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _get($key, /*.any.*/$value, /*.array.*/$array) {
|
|
||||||
foreach ($array as $item) {
|
|
||||||
if ($item[$key] == $value) return $item;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _get_key($key, $value, $array) {
|
|
||||||
foreach ($array as $name => $item) {
|
|
||||||
if ($item[$key] == $value) return $name;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Логическа операция && ко всем элементам массива
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
function every(array $array, $callback) {
|
|
||||||
foreach ($array as $value) {
|
|
||||||
if (call_user_func($callback, $value) === false) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Логическа операция || ко всем элементам массива
|
|
||||||
* @param array $array
|
|
||||||
* @param mixed $callback
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
function some(array $array, $callback) {
|
|
||||||
assert(is_callable($callback));
|
|
||||||
|
|
||||||
foreach ($array as $key => $value) {
|
|
||||||
if (call_user_func($callback, $value) === true) {
|
|
||||||
return $key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function span($length, array $array) {
|
|
||||||
assert(is_int($length));
|
|
||||||
|
|
||||||
$result = array();
|
|
||||||
for($i = 0; $i < count($array); $i += $length) {
|
|
||||||
$result [] = array_slice($array, $i, $length);
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function array_ref($data, $n) {
|
|
||||||
return $data[$n];
|
|
||||||
}
|
|
||||||
|
|
||||||
function call() {
|
|
||||||
$args = func_get_args();
|
|
||||||
$name = array_shift($args);
|
|
||||||
return call_user_func_array($name, $args);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Поиск элемента в массиве
|
|
||||||
* @param function $cb сравнение с элементом массива
|
|
||||||
* @param array $hs массив в котором ищется значение
|
|
||||||
*
|
|
||||||
* @return int|string ключ найденого элемента в массиве
|
|
||||||
*/
|
|
||||||
function array_usearch($cb, array $hs, $strict = false) {
|
|
||||||
foreach($hs as $key => $value) if (call_user_func_array($cb, array($value, $key, $strict))) return $key;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!function_exists('hash_key')) {
|
|
||||||
/**
|
|
||||||
* Преобразует ключи элементов для многомерного массива
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
function hash_key ($key_name,/*. array .*/ $array) {
|
|
||||||
$result = array();
|
|
||||||
|
|
||||||
foreach($array as $value) {
|
|
||||||
$result[$value[$key_name]] = $value;
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Выбирает все сроки из таблицы с уникальными значениями ключа
|
|
||||||
* @param $name Имя ключа
|
|
||||||
* @param $table Двухмерный массив
|
|
||||||
* @example
|
|
||||||
* key_unique_values ('name', array (array ('name' => 1), array ('name' => 2), array ('name' => 1)))
|
|
||||||
=> array (1, 2)
|
|
||||||
* @end example
|
|
||||||
*/
|
|
||||||
function key_unique_values ($name, $table) {
|
|
||||||
// Ищем уникальные значения для заданного ключа
|
|
||||||
$keys = array ();
|
|
||||||
foreach ($table as $row) {
|
|
||||||
if (!in_array ($row[$name], $keys))
|
|
||||||
$keys[] = $row[$name];
|
|
||||||
}
|
|
||||||
return $keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Сортировка двумерного массива по заданному ключу
|
|
||||||
* @param $array Массив
|
|
||||||
* @param $key Имя ключа по значению которого будет идти сравнение
|
|
||||||
* @return Отсортированный массив
|
|
||||||
*/
|
|
||||||
function sortOn($array, $key, $fn = '__cmp') {
|
|
||||||
usort ($array, rcurry($fn, $key));
|
|
||||||
//usort ($array, create_function ('$x,$y', 'return __cmp ($x, $y, "'.$key.'");'));
|
|
||||||
return $array;
|
|
||||||
}
|
|
||||||
|
|
@ -4,9 +4,6 @@
|
||||||
* Преобразование дерева из модели Plain в массив массивов (Adjacency List)
|
* Преобразование дерева из модели Plain в массив массивов (Adjacency List)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once 'functions.php';
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Обходит таблицу как дерево
|
* Обходит таблицу как дерево
|
||||||
* $fn ($name, $index, $rows, $cc)
|
* $fn ($name, $index, $rows, $cc)
|
||||||
|
|
@ -23,10 +20,10 @@ function tableTreeWalk($level, $table, $fn) {
|
||||||
if (empty ($level)) return $table;
|
if (empty ($level)) return $table;
|
||||||
$name = array_shift ($level);
|
$name = array_shift ($level);
|
||||||
|
|
||||||
$keys = key_unique_values($name, $table);
|
$keys = Functions::key_unique_values($name, $table);
|
||||||
$data = array ();
|
$data = array ();
|
||||||
foreach ($keys as $index) {
|
foreach ($keys as $index) {
|
||||||
list($rows, $table) = partition (lcurry('__index', $index, $name), $table);
|
list($rows, $table) = Functions::partition (Functions::lcurry(['Functions', '__index'], $index, $name), $table);
|
||||||
// $rows = array_filter ($table, lcurry('__index', intval($index), $name));
|
// $rows = array_filter ($table, lcurry('__index', intval($index), $name));
|
||||||
//$rows = array_filter ($table, create_function ('$x', 'return __index ('.intval($index).', \''.$name.'\', $x);'));
|
//$rows = array_filter ($table, create_function ('$x', 'return __index ('.intval($index).', \''.$name.'\', $x);'));
|
||||||
$data[$index] = call_user_func ($fn, $name, $index, $rows, tableTreeWalk ($level, $rows, $fn));
|
$data[$index] = call_user_func ($fn, $name, $index, $rows, tableTreeWalk ($level, $rows, $fn));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue