public static function isParent(&$layer, &$parent) { while ($layer) { if (Each::isEqual($parent, $layer)) { return true; } $layer =& $layer['parent']; } return false; }
public static function merge(&$layer, &$external, $i) { //Используется в configinherit if (Each::isEqual($external[$i], $layer[$i])) { //Иначе null равено null но null свойство есть и null свойства нет разные вещи } elseif (isset(static::$props[$i])) { $func = static::$props[$i]; while (is_string($func)) { //Указана не сама обработка а свойство с такойже обработкой $func = static::$props[$func]; } $layer[$i] = call_user_func_array($func, array(&$layer[$i], &$external[$i], &$layer, &$external, $i)); } else { if (is_null($layer[$i])) { $layer[$i] = $external[$i]; } } }
$test.='b'; },'',$obj); $r=Event::fire('test.ontest', $obj); if($test!='ab'||!$r) return Ans::err($ans,'Событие с объектом '.$test); */ $obj1 = array('id' => 1); $obj2 = array('id' => 2); $obj3 = array('id' => 3); Event::$classes['layer'] = function ($obj) { return $obj['id']; }; $test = ''; Event::handler('layer.ontest', function (&$obj) use(&$test, &$obj2) { $test .= $obj['id']; if ($obj['id'] == $obj2['id']) { if (!Each::isEqual($obj, $obj2)) { return; } } if ($obj['id'] === 1) { return false; } $test .= $obj['id']; }); $r = Event::fire('layer.ontest', $obj2); if (!$r) { return Ans::err($ans, 'Событие анализирую объект возвращает true'); } $r = Event::fire('layer.ontest', $obj1); if ($r) { return Ans::err($ans, 'Событие анализирую объект возвращает false');
} }, 'layer'); */ Event::handler('Layer.isshow', function (&$layer) { //Если не указан див и указан родитель, не показываем ничего //Отсутсвие дива не запрещает показ //Такой слой игнорируется, события onshow не будет, но обработка пройдёт дальше у других дивов if (empty($layer['div'])) { return; } $start = false; if ($master = Run::exec(Controller::$layers, function &(&$l) use(&$layer, &$start) { //Пробежка не по слоям на ветке, а по всем слоям обрабатываемых после.. .то есть и на других ветках тоже $r = null; if (!$start) { if (Each::isEqual($layer, $l)) { $start = true; } return $r; } if (empty($l['div'])) { return $r; } if (empty($l['tpl'])) { return $r; } if ($l['div'] !== $layer['div']) { return $r; } //ищим совпадение дивов впереди if (Event::fire('layer.isshow', $l)) {
} if ($obj->parent !== $parent) { return Ans::err($ans, 'Некорректно определён parent'); } Crumb::change('test/hi'); $obj = Crumb::getInstance('test'); if (!$obj->is) { return Ans::err($ans, 'Не применилась крошка на втором уровне'); } $root = Crumb::getInstance(); Crumb::change(''); $crumb = Crumb::getInstance(''); $f = $crumb->query; Crumb::change('test'); $s =& Crumb::getInstance('some'); $s2 =& Crumb::getInstance('some'); $r = Each::isEqual($s, $s2); $s = Crumb::$childs; $r2 = Each::isEqual($s[''], Crumb::getInstance()); $r = $r && $r2; $crumb = Crumb::getInstance('test'); $crumb2 = Crumb::getInstance('test2'); if (!($f == null && $r && !is_null($crumb->value) && is_null($crumb2->value))) { return Ans::err($ans, 'Изменения крошек'); } Crumb::change('test/test'); $inst = Crumb::getInstance('test/test/test'); Crumb::change($query); Layer::$start_id = 1; Layer::$ids = array(); return Ans::ret($ans);
public function testEach() { /** * Проверка на ассоциативный массив. * Метод возвращает true только в том случае, если массив ассоциативный. */ $elements = ['9' => '42', 8, 4, 5, 3]; $res = Each::isAssoc($elements); $this->assertTrue($res); $elements = 10; $res = Each::isAssoc($elements); $this->assertTrue(null === $res); $elements = [9, 8, 4, 5, 3]; $res = Each::isAssoc($elements); $this->assertTrue(false === $res); /** * Проверка на число. * Если передано число в текстовом формате, то метод должен отработать * с этим аргументом как с числом. */ $el = ''; $res = Each::isInt($el); $this->assertTrue(false === $res); $el = 12; $res = Each::isInt($el); $this->assertTrue(true === $res); $el = '12'; $res = Each::isInt($el); $this->assertTrue(true === $res); $el = '12 '; $res = Each::isInt($el); $this->assertTrue(false === $res); /** * Проверка ссылок друг на друга. * Метод возвращает true, когда две переменные являются ссылками друг на друга. */ $a = 1; $b = 1; $res = Each::isEqual($a, $b); $this->assertTrue(false === $res); $a = 1; $b = $a; $res = Each::isEqual($a, $b); $this->assertTrue(false === $res); $a = 1; $b =& $a; $res = Each::isEqual($a, $b); $this->assertTrue(true === $res); /** * Проверяем, количество вызовов и на какой элемент попадаем при определенном количестве вызовов. * Для индексного массива количество итераций анонимной функции должно равняться количеству элементов в массиве. * Если в индексном массиве находится вложенный индексный массив, то анонимная функция должна вызываться и * для каждого индекса вложенного массива. * Если методу передан простой элемент или ассоциативный массив, вызов анонимной функции * должен произойти только один раз. */ $counter = 0; $el = ['oduvanio', 'mail']; Each::exec($el, function &() use(&$counter) { $r = null; $counter++; return $r; }); $this->assertTrue(2 === $counter); $counter = 0; $el = [2, [4, 6], 5]; Each::exec($el, function ($b) use(&$counter) { $counter++; if ($counter === 3) { $this->assertTrue(6 === $b); } }); $this->assertTrue(4 === $counter); $counter = 0; $el = 1; Each::exec($el, function () use(&$counter) { $counter++; }); $this->assertTrue(1 === $counter); $el = 'test'; Each::exec($el, function () use(&$counter) { $counter++; }); $this->assertTrue(2 === $counter); $el = ['name' => 'oduvanio', 'email' => 'mail']; Each::exec($el, function () use(&$counter) { $counter++; }); $this->assertTrue(3 === $counter); }
function xls_processGroupFilter(&$data) { $all = array(); xls_runGroups($data, function &(&$gr) use(&$all) { $title = mb_strtolower($gr['title']); //echo $title.'<br>'; if (!isset($all[$title])) { $all[$title] = array('orig' => &$gr, 'list' => array()); } else { //Ну вот и нашли повторение $all[$title]['list'][] =& $gr; //xls_merge($all[$title],$gr); //у некой прошлой группы появляются новые childs.. но мы всё ещё бежим по какому-то его childs и новые добавленные будут проигнорированны //return new Fix('del'); } $r = null; return $r; }); Each::foro($all, function &(&$des) { Each::forr($des['list'], function &(&$gr) use($des) { xls_merge($des['orig'], $gr); Each::forr($gr['parent']['childs'], function &(&$g) use(&$gr) { if (Each::isEqual($g, $gr)) { $r = new Fix('del', true); return $r; } $r = null; return $r; }); $r = null; return $r; }); $r = null; return $r; }); /*//$cat=$data['childs'][0]; $cat=$data; unset($cat['parent']); Each::forr($cat['childs'],function(&$g){ //if(!is_string($g['parent'])) $g['parent']=&$g['parent']['title']; //unset($g['parent']); $g['childs']=sizeof($g['childs']); $g['data']=sizeof($g['data']); }); echo '<pre>'; print_r($cat); exit; /* xls_runGroups($data,function(&$gr,$i,&$group){//Удаляем пустые группы if(!$group) return;//Кроме верхней группы if(!sizeof($gr['childs'])&&!sizeof($gr['data'])){ array_splice($group,$i,1); } },array(),true); */ }
//if($arr!=false)return Ans::err($ans,'функция infra_isAssoc вернула неверный результат, переданный массив является индексным'); //Проверить, являются ли переданые переменные ссылкой друг на друга $a = 15; // создаем переменную a $b = $a; // записываем копию переменной a в переменную b $equal = Each::isEqual($a, $b); if ($equal !== false) { return Ans::err($ans, 'Функция infra_isEqual работает неверно $b не является ссылкой на $a'); } $b =& $a; // делаем b ссылкой на a $equal = Each::isEqual($a, $b); if ($equal !== true) { return Ans::err($ans, 'Функция infra_isEqual работает неверно $b является ссылкой на $a'); } $a = array(1, 2, 4, 7); // интересно получается, так как раннее мы $b=&$a то уже здесь, даже если присваивать массивы этим переменным, то всё равно при изменении $b всё записывается в $a $b = array(1, 2, 4, 11); $equal = Each::isEqual($a, $b); if ($equal !== true) { return Ans::err($ans, 'Функция infra_isEqual работает неверно $b является ссылкой на $a'); } $b = array(1, 2, 4, 15); $c = array(1, 2, 4, 11); //print_r($a); $equal = Each::isEqual($b, $c); if ($equal !== false) { return Ans::err($ans, 'Функция infra_isEqual работает не правильно, массив $с не является ссылкой на $b'); } return Ans::ret($ans, 'Всё ок');
public static function check(&$layer) { if (!isset($layer['env'])) { return; } $r = null; //Слои myenv надо показывать тогдаже когда и показывается сам слой $myenv = null; $ll = null; Run::exec(Controller::$layers, function (&$l) use(&$layer, &$myenv, &$ll) { //Есть окружение и мы не нашли ни одного true для него if (!isset($l['myenv'])) { return; } if (!Event::fire('layer.ischeck', $l)) { return; } //В back режиме выйти нельзя.. смотрятся все слои if (Each::isEqual($l, $layer)) { return; } //Значение по умолчанию смотрится отдельно if (!isset($l['myenv'][$layer['env']])) { return; } if (is_null($l['myenv'][$layer['env']])) { return; } if (Event::fire('layer.isshow', $l)) { //Ищим последнюю установку на счёт env $myenv = $l['myenv'][$layer['env']]; $ll =& $l; } }); if (!is_null($myenv)) { //Если слой скрываем слоем окружения который у него в родителях числиться он после этого сам всё равно должен показаться if ($myenv) { //Значение по умолчанию смотрим только если myenv undefined $r = true; } else { $r = false; $layer['is_save_branch'] = !!Layer::isParent($ll, $layer); //infrajs_isSaveBranch($layer,false); } } if (is_null($r) && @$layer['myenv']) { //Значение по умолчанию $myenv = $layer['myenv'][$layer['env']]; if (!is_null($myenv)) { //Оо есть значение по умолчанию для самого себя if ($myenv) { $r = true; } else { //Если слой по умолчанию скрыт его детей не показываем $r = false; $layer['is_save_branch'] = false; } } } $layer['envval'] = $myenv; if ($r) { return !!$myenv; } return false; }