PHP 对比 Erlang

数组过滤

PHP 比较数组过滤

$arr = array(
  array(1, 9),
  array(1, 8),
  array(6, 10),
  array(15, 44),
  array(4, 6),
  array(30, 5),
);

$newarr = array();
foreach($arr as $key => $value) {
  if($value[0] > 10 && $value[1] > 10) {
    $newarr[] = $value;
  }
}

var_dump($newarr);

Erlang列表解析做相同的事

L = [{1,9},{1,8},{6,10},{15,44},{4,6},{30, 5}].
[{X,Y} || {X,Y} <- L, X >10, Y>10].

毕达哥拉斯三元组

$M = 11;
$R = array();

for($X = 1; $X < $M; $X++) {
  for($Y = 1; $Y < $M; $Y++) {
    for($Z = 1; $Z < $M; $Z++) {
      if($X > $Y && $Y > $Z && $Z*$Z + $Y * $Y == $X * $X) {
        $R[] = array($X, $Y, $Z);
      }
    }
  }
}
print '
';
print_r($R);

Erlang

pythag(N) -> [{A,B,C} || 
	A <- lists:seq(1, N),
        B <- lists:seq(1, N),
	C <- lists:seq(1, N),
	A < B,
	B < C,
	A*A + B*B =:= C*C
].

Drupal 上传文件以文件的md5命名

有这么一种场景: 如果你的Drupal作为一个server,客户端每次都需要将服务器上的资源下载到客户端,你如何保证下载的内容不重复?比如 a.jpg和b.jpg其它是一张图片复制,只是换了一个名字。如何保证客户端不浪费流量,只需要下载一次?

我这里的解决方案是当上传文件的时候给文件重命名,名字中包含这个文件的md5, 文件md5能确保这个文件的唯一性. 客户端在下载资源的时候,只需要判断文件名前面的md5是否存在既可.

/**
 * 文件上传名增加md5效验.
 *
 * Implements hook_file_insert().
 */
function HOOK_file_insert($file) {
  if ($wrapper = file_stream_wrapper_get_instance_by_uri($file->uri)) {
    $realpath = $wrapper->realpath();
    // 获取文件名.
    $basename = drupal_basename($file->uri);
    $dirname = drupal_dirname($file->uri);

    // 当已是md5加密的文件名去掉加密头.
    if(preg_match('#([a-z0-9]{32})_(.*)#', $basename, $matches)) {
      $basename = $matches[2];
    }
    $filename = md5_file($realpath) . '_' . $basename;
    $newpath = file_create_filename($filename, $dirname);
    file_move($file, $newpath, FILE_EXISTS_RENAME);
  }
}