小编Alm*_* Do的帖子

PHP中的递归生成器

介绍

从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)

php recursion generator

29
推荐指数
2
解决办法
6501
查看次数

检查2D平面上两点之间的连接

所以,

问题

我有一个关于确定两个点是否连接在2D平面上的算法的问题.我有:

  • 2D线阵列.每条线都以其起始端2D点限制.每个点都是两个元素的简单数组[x,y]- 即每条线看起来像['start'=>[X0, Y0], 'end'=>[X1, Y1]]这条线被命名为L.线可以彼此属于一个(即一个可以是另一个的一部分),它们可以仅与一个点相交等 - 即在2D平面上没有它们的限制.但是线不能是一个点 - 即线的起点不能等于线的终点.
  • 两点SE,即阵列[Xs, Ys][Xe, Ye]

现在,所有线L都在平面上绘制.然后,SE也拉,我需要回答的问题- 可以从S为达到ê不以L任何线的交叉?而且,更具体一点 - 哪种算法最优?通过"可达到"我的意思是,有在飞机上的方式从SE没有任何交集的线L-和,事业,这种方法可以是任何东西,而不仅仅是行.

样品

在此输入图像描述

-as你看,在样品SE未连接.同样在样本中存在一条线完全属于另一条线(灰线和紫线)的情况 - 以及一条线在另一条线(绿线和玫瑰线)上具有开始/结束的情况.

我的方法

目前,我有非确定性多项式(NP)算法来做到这一点.它的步骤是:

  • 查找每对线的所有交叉点.
  • 从第一步的点创建新的一组线.如果两条线有一个交叉点,则每条新线的起点将有4条新线与交叉点 - 如果第一条线在第二条线上有它的开始/结束,它可以是3条新线 - 或者它可以是2条新线如果第一行的开头/结尾与第二行的开头/结尾完全匹配.即:

两行的五个一般情况

因此,第一种情况将导致4条新线,3条新线中的2-4例和2条新线中的5例.(线是[A, B][C, D])

  • 接下来,在第2步的第一步中,我搜索所有多边形.多边形是一个闭合线集(即它保持封闭的部分区域)
  • 我正在确定S包含这些多边形的子集S.要做到这一点,我正在使用简单的算法 - 计算多边形边缘的交点数和从 …

algorithm complexity-theory graph

27
推荐指数
2
解决办法
2033
查看次数

PHP中的基准内存使用情况

所以,

细节

让我们假设我们有一些问题,至少有两个解决方案.我们想要实现的目标是比较它们的有效性.这该怎么做?显然,最好的答案是:做测试.我怀疑在语言特定的问题上有更好的方法(例如"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并在此之后,我们可以说,代码XZ%更快/比代码慢Y.

问题

好的,我们可以轻松测量时间.但记忆呢?我们之前的假设"如果我们想测试一些代码,它等于测试一些函数"似乎在这里不正确.为什么?因为 - 从形式上看它是真的,但如果我们将代码隐藏在函数中,那么我们将永远无法在此之后测量内存.例:

function foo($x, $y)
{
   $bar = array_fill(0, $y, str_repeat('bar', …
Run Code Online (Sandbox Code Playgroud)

php memory performance benchmarking

22
推荐指数
2
解决办法
4883
查看次数

访问类定义之外的变量和方法

假设我有这样一行的php文件:

<?php
function abc() {  }

$foo = 'bar';

class SomeClass {  }
?>
Run Code Online (Sandbox Code Playgroud)

我需要做些什么特别的使用abc()$foo内部SomeClass?我正在考虑global在函数中使用来访问函数外部定义的变量.

(我是PHP的OOP新手)

php

14
推荐指数
3
解决办法
5万
查看次数

将float转换为纯字符串表示形式

所以,

问题

我的问题是关于简单的事情:如何将数字字符串转换为它的普通("本机")表示.这意味着:如果数字字符串已经处于普通视图中,请保持原样,但如果它是科学记数法,则转换它.样品:

"3"          -->  "3"
"1.5"        -->  "1.5"
"-15.482E-2" -->  "-0.15482"

数字字符串应该是有效的,如果不是 - 那么它不是转换的情况(我们可以自由地返回null或空字符串,例如).

用例

这是必要的,bcmath因为它不适用于科学浮标.因此,它们需要转换为普通字符串(在此处询问).这个用例的重要结果是数字字符串可以是1E-300或类似的东西1E+500.因为我们正在合作bcmath- 它的目的是处理这些事情.

我的方法

就目前而言,我已经使用实现了这一点,例如:

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()格式?

重要提示:我不想处理精确度.我想要黑盒子.在那里传递数字 - 得到字符串作为输出.就这样.不想处理任何其他事情.事实上,我所有的正则表达式都是关于计算长度和精度的 - 所以,当然,如果明确地传递它们(例如参数) …

php format floating-point

13
推荐指数
1
解决办法
5541
查看次数

在MySQL中反向加入

所以,

问题

我的问题是 - 如何以相反的顺序将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)

mysql sql join sql-order-by

12
推荐指数
1
解决办法
2373
查看次数

最大连续可达到的数量

问题

定义

  • 让我们将自然数定义为数字集N可写数(WN)在此输入图像描述M数字系统中,如果可以U使用每个成员的成员在该数字系统中写入不超过一次.更严格的'书面'定义:在此输入图像描述- 这里CONCAT意味着连接.
  • 让我们将自然数定义为符号集N连续可实现数(CAN)在此输入图像描述M数字系统,如果它为WN-数UM,并且还N-1为CAN-数UM(另一个定义可以N是CAN用于UM如果所有0 .. N数字是WN为UM).更严格:在此输入图像描述

问题

我们有一组S自然数:在此输入图像描述(我们将零视为自然数)和自然数M,M>1.问题是找到给定U和最大的CAN(MCAN)M.给定集U 可能包含重复 - 但每个副本不能多次使用,原因(即如果U包含{x,y,y,z} - 则每个y可以使用0或1次,因此y可以使用0 ..总共2次).也U期望在M数字系统中有效(即不能包含符号8或 …

algorithm numbers

11
推荐指数
1
解决办法
423
查看次数

比较PHP中的相等对象

细节

首先,在我的情况下,"相等"的定义是 - 当对象具有相同的结构和该结构的值时,它们是相等的.但是,它们可能不是同一个实例,或者属性可能不在同一个"顺序"(我的意思是,因为它们被分配/定义).这里有类似的问题,就像这样 - 但它们并没有涵盖我的情况.

由于我的代码测试目的,我需要比较PHP中的实体 - 这些实体可能是任何东西.特别是,它们可能是物体.然而,对象比较并不"安全".想象一下,你正在比较:

$result = $objectX == $objectY;
Run Code Online (Sandbox Code Playgroud)

如果对象具有循环引用,这可能会导致致命错误.我在这里准备的简单例子.正如我们所看到的,PHP试图遵循嵌套级别并在无限循环中失败 - 因为自然对象在内容上是相同的,但具有循环引用.

重要的细节是对象可能包含不可序列化的东西(如闭包),这使得无法依赖"seralize/unserialize"方法(即使忘记了无序的比较)

目前的做法

我有这样的代码(相当过分,直接粘贴在这里,但为了以防万一,这里是一个要点) -所以我表演DFS有接球这样的循环引用的情况.正如你所看到的,它非常复杂 - 顺便说一下,它很慢.

当前方法的另一个问题是 - 当对象内部有数组时,它们将在元素顺序方面进行比较,在某些情况下,这对我来说不合适(理想情况 - 当我能够切换顺序时 - 明智的比较),但为了克服它本身,我可能需要以某种方式"排序"数组 - 我不知道如何做到这一点 - 因为,再次,这些数组元素的比较将是不安全的.

而且,循环数组引用也会导致失败:

$array = ['foo', $object, &$array];
Run Code Online (Sandbox Code Playgroud)

什么是解决问题的其他(更好)方法?序列化对象可能就是这种情况,但由于非有序的属性集,它将失败.

php comparison object circular-reference

11
推荐指数
1
解决办法
857
查看次数

获取行产品(乘法)

所以,

问题

我有行乘法的问题.在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 …

mysql sql

10
推荐指数
1
解决办法
765
查看次数

使用arguments伪参数作为可写事物

在javascript中,有arguments伪参数这样的东西,它允许动态地与函数参数交互.现在,当我正在听关于javascript基本事物和标准的讲座时,有一句话:

"不要arguments用作可写结构,总是把它视为只读的东西"

我从来没有arguments在那里写过,所以这对我来说不是问题 - 但是,真的 - 我想问问我

问题:在使用arguments写作时是否存在任何实际用例?如果没有,那么为什么不arguments应该用它来写呢?

javascript arguments function

7
推荐指数
1
解决办法
223
查看次数