从PHP 5.5版开始,就像生成器一样出色.我不会重复官方手册页,但它们对于迭代器的简短定义是很好的.最着名的样本是:
function xrange($from, $till, $step)
{
if ($from>$till || $step<=0)
{
throw new InvalidArgumentException('Invalid range initializers');
}
for ($i = $from; $i < $till; $i += $step)
{
yield $i;
}
}
//...
foreach (xrange(2, 13, 3) as $i)
{
echo($i.PHP_EOL); // 2,5,8,11
}
Run Code Online (Sandbox Code Playgroud)
和生成器实际上不是一个函数,而是一个具体类的实例:
get_class(xrange(1, 10, 1)); // Generator
Run Code Online (Sandbox Code Playgroud)
完成RTM的东西,现在继续我的问题.想象一下,我们想要创建Fibonacci数的生成器.通常,为了获得这些,我们可以使用简单的功能:
function fibonacci($n)
{
if(!is_int($n) || $n<0)
{
throw new InvalidArgumentException('Invalid sequence limit');
}
return $n < 2 ? $n : fibonacci($n-1) + …Run Code Online (Sandbox Code Playgroud) 所以,
问题
我有一个关于确定两个点是否连接在2D平面上的算法的问题.我有:
[x,y]- 即每条线看起来像['start'=>[X0, Y0], 'end'=>[X1, Y1]]这条线被命名为L.线可以彼此属于一个(即一个可以是另一个的一部分),它们可以仅与一个点相交等 - 即在2D平面上没有它们的限制.但是线不能是一个点 - 即线的起点不能等于线的终点.S和E,即阵列[Xs, Ys]和[Xe, Ye]现在,所有线L都在平面上绘制.然后,S和E也拉,我需要回答的问题- 可以从S为达到ê不以L任何线的交叉?而且,更具体一点 - 哪种算法最优?通过"可达到"我的意思是,有在飞机上的方式从S以E没有任何交集的线L-和,事业,这种方法可以是任何东西,而不仅仅是行.
样品

-as你看,在样品S和E未连接.同样在样本中存在一条线完全属于另一条线(灰线和紫线)的情况 - 以及一条线在另一条线(绿线和玫瑰线)上具有开始/结束的情况.
我的方法
目前,我有非确定性多项式(NP)算法来做到这一点.它的步骤是:
因此,第一种情况将导致4条新线,3条新线中的2-4例和2条新线中的5例.(线是[A, B]和[C, D])
S包含这些多边形的子集S.要做到这一点,我正在使用简单的算法 - 计算多边形边缘的交点数和从 …所以,
细节
让我们假设我们有一些问题,至少有两个解决方案.我们想要实现的目标是比较它们的有效性.这该怎么做?显然,最好的答案是:做测试.我怀疑在语言特定的问题上有更好的方法(例如"PHP更快echo 'foo', 'bar'或者更快echo('foo'.'bar')").
好的,现在我们假设如果我们想测试一些代码,它等于测试一些函数.为什么?因为我们可以将该代码包装起来并传递它的上下文(如果有的话)作为它的参数.因此,我们所需要的只是拥有一些可以完成所有工作的基准功能.这是非常简单的一个:
function benchmark(callable $function, $args=null, $count=1)
{
$time = microtime(1);
for($i=0; $i<$count; $i++)
{
$result = is_array($args)?
call_user_func_array($function, $args):
call_user_func_array($function);
}
return [
'total_time' => microtime(1) - $time,
'average_time' => (microtime(1) - $time)/$count,
'count' => $count
];
}
Run Code Online (Sandbox Code Playgroud)
- 这符合我们的问题,可以用来做比较基准测试.在比较我的意思是,我们可以使用以上功能的代码X,然后代码Y并在此之后,我们可以说,代码X是Z%更快/比代码慢Y.
问题
好的,我们可以轻松测量时间.但记忆呢?我们之前的假设"如果我们想测试一些代码,它等于测试一些函数"似乎在这里不正确.为什么?因为 - 从形式上看它是真的,但如果我们将代码隐藏在函数中,那么我们将永远无法在此之后测量内存.例:
function foo($x, $y)
{
$bar = array_fill(0, $y, str_repeat('bar', …Run Code Online (Sandbox Code Playgroud) 假设我有这样一行的php文件:
<?php
function abc() { }
$foo = 'bar';
class SomeClass { }
?>
Run Code Online (Sandbox Code Playgroud)
我需要做些什么特别的使用abc()和$foo内部SomeClass?我正在考虑global在函数中使用来访问函数外部定义的变量.
(我是PHP的OOP新手)
所以,
问题
我的问题是关于简单的事情:如何将数字字符串转换为它的普通("本机")表示.这意味着:如果数字字符串已经处于普通视图中,请保持原样,但如果它是科学记数法,则转换它.样品:
"3" --> "3" "1.5" --> "1.5" "-15.482E-2" --> "-0.15482"
数字字符串应该是有效的,如果不是 - 那么它不是转换的情况(我们可以自由地返回null或空字符串,例如).
用例
这是必要的,bcmath因为它不适用于科学浮标.因此,它们需要转换为普通字符串(在此处询问).这个用例的重要结果是数字字符串可以是1E-300或类似的东西1E+500.因为我们正在合作bcmath- 它的目的是处理这些事情.
我的方法
就目前而言,我已经使用regex-allmighty实现了这一点,例如:
function parseFloat($string)
{
$string = (string)$string;
if(preg_match('/^[+-]?(\d+|\d+\.\d*)[Ee]([+-]?)(\d+)$/', $string, $matches))
{
$precision = false!==($dot=strpos($matches[1], '.'))
?strlen($matches[1])-$dot-1
:0;
$precision = $matches[2]=='-'
?$precision + (int)$matches[3]
:$precision - (int)$matches[3];
return number_format($string, $precision<0?0:$precision, '', '');
}
if(preg_match('/^[+-]?(\d+|\d+\.\d+)$/', $string))
{
return $string;
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题
我觉得应该有更简单明智的方法来做到这一点.如何在PHP中以更简单的方式实现这一点?可能是一些棘手的sprintf()格式?
重要提示:我不想处理精确度.我想要黑盒子.在那里传递数字 - 得到字符串作为输出.就这样.不想处理任何其他事情.事实上,我所有的正则表达式都是关于计算长度和精度的 - 所以,当然,如果明确地传递它们(例如参数) …
所以,
问题
我的问题是 - 如何以相反的顺序将MySQL中的表连接起来?假设我有:
id name 1 First 2 Second 5 Third 6 Fourth 7 Fifth 8 Sixth 9 Seventh 13 Eight 14 Nine 15 Tenth
- 现在我想创建一个查询,它将以相反的顺序返回连接的记录:
left_id name right_id name 1 First 15 Tenth 2 Second 14 Nine 5 Third 13 Eight 6 Fourth 9 Seventh 7 Fifth 8 Sixth 8 Sixth 7 Fifth 9 Seventh 6 Fourth 13 Eight 5 Third 14 Nine 2 Second 15 Tenth 1 First
我的方法
我现在有这个查询:
SELECT
l.id AS left_id,
l.name, …Run Code Online (Sandbox Code Playgroud) 问题
定义
N的可写数(WN)
在M数字系统中,如果可以U使用每个成员的成员在该数字系统中写入不超过一次.更严格的'书面'定义:
- 这里CONCAT意味着连接.N的连续可实现数(CAN)
在M数字系统,如果它为WN-数U和M,并且还N-1为CAN-数U和M(另一个定义可以N是CAN用于U和M如果所有0 .. N数字是WN为U和M).更严格:
问题
我们有一组S自然数:
(我们将零视为自然数)和自然数M,M>1.问题是找到给定U和最大的CAN(MCAN)M.给定集U 可能包含重复 - 但每个副本不能多次使用,原因(即如果U包含{x,y,y,z} - 则每个y可以使用0或1次,因此y可以使用0 ..总共2次).也U期望在M数字系统中有效(即不能包含符号8或 …
细节
首先,在我的情况下,"相等"的定义是 - 当对象具有相同的结构和该结构的值时,它们是相等的.但是,它们可能不是同一个实例,或者属性可能不在同一个"顺序"(我的意思是,因为它们被分配/定义).这里有类似的问题,就像这样 - 但它们并没有涵盖我的情况.
由于我的代码测试目的,我需要比较PHP中的实体 - 这些实体可能是任何东西.特别是,它们可能是物体.然而,对象比较并不"安全".想象一下,你正在比较:
$result = $objectX == $objectY;
Run Code Online (Sandbox Code Playgroud)
如果对象具有循环引用,这可能会导致致命错误.我在这里准备的简单例子.正如我们所看到的,PHP试图遵循嵌套级别并在无限循环中失败 - 因为自然对象在内容上是相同的,但具有循环引用.
重要的细节是对象可能包含不可序列化的东西(如闭包),这使得无法依赖"seralize/unserialize"方法(即使忘记了无序的比较)
目前的做法
我有这样的代码本(相当过分,直接粘贴在这里,但为了以防万一,这里是一个要点) -所以我表演DFS有接球这样的循环引用的情况.正如你所看到的,它非常复杂 - 顺便说一下,它很慢.
当前方法的另一个问题是 - 当对象内部有数组时,它们将在元素顺序方面进行比较,在某些情况下,这对我来说不合适(理想情况 - 当我能够切换顺序时 - 明智的比较),但为了克服它本身,我可能需要以某种方式"排序"数组 - 我不知道如何做到这一点 - 因为,再次,这些数组元素的比较将是不安全的.
而且,循环数组引用也会导致失败:
$array = ['foo', $object, &$array];
Run Code Online (Sandbox Code Playgroud)
题
什么是解决问题的其他(更好)方法?序列化对象可能就是这种情况,但由于非有序的属性集,它将失败.
所以,
问题
我有行乘法的问题.在SQL中,有一个SUM()函数可以计算行集的某些字段的总和.我想得到乘法,即表格
+------+ | data | +------+ | 2 | | -1 | | 3 | +------+
that will be 2*(-1)*3 = -6 as a result. I'm using DOUBLE data type for storing my data values.
My approach
From school math it is known that log(A x B) = log(A) + log(B) - so that could be used to created desired expression like:
SELECT
IF(COUNT(IF(SIGN(`col`)=0,1,NULL)),0,
IF(COUNT(IF(SIGN(`col`)<0,1,NULL))%2,-1,1)
*
EXP(SUM(LN(ABS(`col`))))) as product
FROM `test`;
Run Code Online (Sandbox Code Playgroud)
-here you see weakness of …
在javascript中,有arguments伪参数这样的东西,它允许动态地与函数参数交互.现在,当我正在听关于javascript基本事物和标准的讲座时,有一句话:
"不要arguments用作可写结构,总是把它视为只读的东西"
我从来没有arguments在那里写过,所以这对我来说不是问题 - 但是,真的 - 我想问问我
问题:在使用arguments写作时是否存在任何实际用例?如果没有,那么为什么不arguments应该用它来写呢?
php ×5
algorithm ×2
mysql ×2
sql ×2
arguments ×1
benchmarking ×1
comparison ×1
format ×1
function ×1
generator ×1
graph ×1
javascript ×1
join ×1
memory ×1
numbers ×1
object ×1
performance ×1
recursion ×1
sql-order-by ×1