• 关于

    array_filter

    的搜索结果

回答

PHP 5.6引入了第三个参数array_filter(),flag,你可以设置为ARRAY_FILTER_USE_KEY通过键,而不是值进行筛选: $my_array = ['foo' => 1, 'hello' => 'world']; $allowed = ['foo', 'bar']; $filtered = array_filter( $my_array, function ($key) use ($allowed) { return in_array($key, $allowed); }, ARRAY_FILTER_USE_KEY ); 显然,这不如优雅array_intersect_key($my_array, array_flip($allowed)),但是它确实提供了额外的灵活性,$allowed可以对键执行任意测试,例如可以包含正则表达式模式而不是纯字符串。 您还可以ARRAY_FILTER_USE_BOTH将值和键都传递给过滤器函数。这是一个基于第一个示例的示例,但请注意,我不建议您使用$allowed这种方式编码过滤规则: $my_array = ['foo' => 1, 'bar' => 'baz', 'hello' => 'wld']; $allowed = ['foo' => true, 'bar' => true, 'hello' => 'world']; $filtered = array_filter( $my_array, function ($val, $key) use ($allowed) { // N.b. $val, $key not $key, $val return isset($allowed[$key]) && ( $allowed[$key] === true || $allowed[$key] === $val ); }, ARRAY_FILTER_USE_BOTH ); // ['foo' => 1, 'bar' => 'baz'] 问题来源于stack overflow
保持可爱mmm 2020-01-15 16:32:07 0 浏览量 回答数 0

回答

由于似乎没有人做过此事,因此我认为最好在某个地方提供参考。我已经通过基准测试或代码掠过来表征这些array_*功能。我试图将更有趣的Big-O放在顶部。此列表不完整。 注意:假设是哈希查找,所有计算出来的Big-O都是O(1),即使它实际上是O(n)。n的系数是如此之低,在大Big-O的特征开始生效之前,存储足够大的数组的内存开销会伤害您。例如,array_key_exists在N = 1和N = 1,000,000时的通话时间差为〜50%。 有趣的地方: isset/ array_key_exists比in_array和快得多array_search +(联盟)比array_merge(看起来更好)快一点。但是它的工作方式有所不同,因此请记住这一点。 shuffle 在与Big-O相同的层上 array_rand array_pop/ array_push比重新索引罚款更快array_shift/array_unshift 查询: array_key_existsO(n)但实际上接近O(1)-这是由于碰撞中的线性轮询,但是由于碰撞的机会非常小,因此系数也非常小。我发现您将哈希查找视为O(1)来给出更现实的big-O。例如,N = 1000和N = 100000之间的差异仅减慢了50%。 isset( $array[$index] )O(n)但实际上接近O(1)-它使用与array_key_exists相同的查找。由于是语言构造,因此如果密钥是硬编码的,将缓存查找,从而在重复使用同一密钥的情况下加快了查找速度。 in_array O(n)-这是因为它将对数组进行线性搜索,直到找到该值为止。 array_search O(n)-它使用与in_array相同的核心功能,但返回值。 队列功能: array_push O(∑ var_i,对于所有i) array_pop O(1) array_shift O(n)-必须重新索引所有键 array_unshift O(n + ∑ var_i,对于所有i)-必须重新索引所有键 数组相交,并集,减法: array_intersect_key 如果交集100%进行O(Max(param_i_size)* ∑param_i_count,对于所有i),如果交集0%相交O(∑param_i_size,对于所有i) array_intersect 如果交集100%对所有i执行O(n ^ 2 * ∑param_i_count,对于所有i),如果交集0%与O(n ^ 2)相交 array_intersect_assoc 如果交集100%进行O(Max(param_i_size)* ∑param_i_count,对于所有i),如果交集0%相交O(∑param_i_size,对于所有i) array_diff O(πparam_i_size,for all i)-那是所有param_sizes的乘积 array_diff_key O(∑ param_i_size,for i!= 1)-这是因为我们不需要遍历第一个数组。 array_merge O(∑ array_i,i!= 1)-不需要遍历第一个数组 (联合)O(n),其中n是第二个数组的大小(即array_first + array_second)-比array_merge少的开销,因为它不必重新编号 array_replace O(∑ array_i,对于所有i) 随机: shuffle 上) array_rand O(n)-需要线性轮询。 明显的Big-O: array_fill 上) array_fill_keys 上) range 上) array_splice O(偏移量+长度) array_slice O(偏移量+长度)或O(n)如果长度= NULL array_keys 上) array_values 上) array_reverse 上) array_pad O(pad_size) array_flip 上) array_sum 上) array_product 上) array_reduce 上) array_filter 上) array_map 上) array_chunk 上) array_combine 上) 我要感谢Eureqa使得找到函数的Big-O很容易。这是一个了不起的免费程序,可以为任意数据找到最佳拟合函数。 编辑: 对于那些怀疑PHP数组查找是的人O(N),我编写了一个基准测试(O(1)对于大多数实际值它们仍然有效)。 php数组查找图 $tests = 1000000; $max = 5000001; for( $i = 1; $i <= $max; $i += 10000 ) { //create lookup array $array = array_fill( 0, $i, NULL ); //build test indexes $test_indexes = array(); for( $j = 0; $j < $tests; $j++ ) { $test_indexes[] = rand( 0, $i-1 ); } //benchmark array lookups $start = microtime( TRUE ); foreach( $test_indexes as $test_index ) { $value = $array[ $test_index ]; unset( $value ); } $stop = microtime( TRUE ); unset( $array, $test_indexes, $test_index ); printf( "%d,%1.15f\n", $i, $stop - $start ); //time per 1mil lookups unset( $stop, $start ); } 问题来源于stack overflow
保持可爱mmm 2020-01-15 16:54:32 0 浏览量 回答数 0

回答

可处理任何数量项目的长衬板: echo join(' and ', array_filter(array_merge(array(join(', ', array_slice($array, 0, -1))), array_slice($array, -1)), 'strlen')); 或者,如果您真的更喜欢冗长: $last = array_slice($array, -1); $first = join(', ', array_slice($array, 0, -1)); $both = array_filter(array_merge(array($first), $last), 'strlen'); echo join(' and ', $both);
保持可爱mmm 2020-02-14 11:52:10 0 浏览量 回答数 0

问题

PHP array_filter参数

我有以下代码: function lower_than_10($i) { return ($i < 10); } 我可以用来过滤这样的数组: $arr = array(7, 8, 9, 10, ...
保持可爱mmm 2020-02-08 11:33:32 1 浏览量 回答数 1

问题

array_map,array_walk和array_filter之间的区别

究竟是什么之间的区别array_map,array_walk和array_filter。我从文档中可以看到,您可以传递一个回调函数来对提供的数组执行操作。但是我似乎没有发现它们之间有什么特别的区别。 他们执行相...
保持可爱mmm 2020-01-15 16:25:04 1 浏览量 回答数 1

回答

1 用户输入的URL在前端用jQuery进行简单的URL合法性检查后,异步提交给PHP2 PHP检测URL是否合法,用Curl进行获取URL的内容3 PHP把的获取Title或出错信息,返回给前端jQuery.<?php //文件编码为UTF-8(无BOM) error_reporting(E_ALL || E_STRICT); $url = 'http://q我q.com'; //首先判断用户输入的URL是否合法 if (!filter_var($url, FILTER_VALIDATE_URL)) { die('你输入的不是一个正常的URL.'); } $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_HEADER => false, CURLOPT_URL => $url, //考虑到有些网站是301跳转的. CURLOPT_FOLLOWLOCATION => true, //连接的超时时间设置为5秒 CURLOPT_CONNECTTIMEOUT => 5, //响应超时时间为5秒 CURLOPT_TIMEOUT => 5, CURLOPT_VERBOSE => false, CURLOPT_AUTOREFERER => true, //接收所有的编码 CURLOPT_ENCODING => '', //返回页面内容 CURLOPT_RETURNTRANSFER => true, )); $response = curl_exec($ch); //检测网页的编码,把非UTF-8编码的页面,统一转换为UTF-8处理. if ('UTF-8' !== ($encoding = mb_detect_encoding($response, array('UTF-8', 'CP936', 'ASCII')))) { $response = mb_convert_encoding($response, 'UTF-8', $encoding); } //匹配一下title $title = '没有成功获取到标题'; if (preg_match('#<title>(.*)</title>#isU', $response, $match)) { $title = $match[1]; } echo $title;
落地花开啦 2019-12-02 02:53:30 0 浏览量 回答数 0

回答

简短的答案是,如果“第二维”可能在任何地方,您都必须至少隐式​​循环才能做到。如果必须在第一项中,则只需执行 is_array($arr[0]); 但是,我能找到的最有效的通用方法是在数组上使用一个foreach循环,每当找到一个命中点时就会短路(至少隐式循环比直接的for()更好): $ more multi.php 'a',2 => 'b',3 => array(1,2,3)); $b = array(1 => 'a',2 => 'b'); $c = array(1 => 'a',2 => 'b','foo' => array(1,array(2))); function is_multi($a) { $rv = array_filter($a,'is_array'); if(count($rv)>0) return true; return false; } function is_multi2($a) { foreach ($a as $v) { if (is_array($v)) return true; } return false; } function is_multi3($a) { $c = count($a); for ($i=0;$i<$c;$i++) { if (is_array($a[$i])) return true; } return false; } $iters = 500000; $time = microtime(true); for ($i = 0; $i < $iters; $i++) { is_multi($a); is_multi($b); is_multi($c); } $end = microtime(true); echo "is_multi took ".($end-$time)." seconds in $iters times\n"; $time = microtime(true); for ($i = 0; $i < $iters; $i++) { is_multi2($a); is_multi2($b); is_multi2($c); } $end = microtime(true); echo "is_multi2 took ".($end-$time)." seconds in $iters times\n"; $time = microtime(true); for ($i = 0; $i < $iters; $i++) { is_multi3($a); is_multi3($b); is_multi3($c); } $end = microtime(true); echo "is_multi3 took ".($end-$time)." seconds in $iters times\n"; ?> $ php multi.php is_multi took 7.53565130424 seconds in 500000 times is_multi2 took 4.56964588165 seconds in 500000 times is_multi3 took 9.01706600189 seconds in 500000 times 隐式循环,但是一旦找到匹配项我们就无法短路... $ more multi.php 'a',2 => 'b',3 => array(1,2,3)); $b = array(1 => 'a',2 => 'b'); function is_multi($a) { $rv = array_filter($a,'is_array'); if(count($rv)>0) return true; return false; } var_dump(is_multi($a)); var_dump(is_multi($b)); ?> $ php multi.php bool(true) bool(false)
保持可爱mmm 2020-02-07 01:12:24 0 浏览量 回答数 0

问题

数组处理函数是什么?

array_distinct(x) → array 从数组 x 删除相同的值. array_intersect(x, y) → array 返回 x 与 y 的交集,没有重复. array_union(x, y) → array 返回 ...
nicenelly 2019-12-01 21:26:41 1224 浏览量 回答数 0

回答

提交的某字段,一定是_POST、_GET甚至_REQUEST,而不是单纯讨论$var。要防三个情况:1.提交中根本没有这个字段(如果不处理,下标不存在将直接引发运行时错误)2.提交的字段为空3.提交的字段trim()之后为空如果是原生的PHP,我推荐的步骤如下:1.原则是先预处理$_POST。2.把$_POST中所有元素的首尾空格剥了。3.把$_POST中的所有空元素扔了。4.这样,数组中幸存的元素,就都不是空的。判断元素是否存在即可。注意第二和第三步,千万不要傻傻的用foreach自己循环,最好是使用数组函数里的几个遍历函数。代码:$_POST = array_map('trim', $_POST); $_POST = array_filter($_POST); $result = array_key_exists('fieldname', $_POST); if ($result) { // do whatever you wish }这样足够简便了,不过带来的问题是可移植性差(因为需要依赖前边做过的预处理)。如果想要可移植性又好,看着又简单,判断又全面的,自己写函数去吧。
落地花开啦 2019-12-02 02:49:14 0 浏览量 回答数 0

问题

可以转成java吗?

<?php////////////////////////////////////////////////////////////////////////// MG Software Corporation Sdn Bhd.// ...
你好世界123 2019-12-01 20:02:19 1139 浏览量 回答数 3

问题

PHP:如何使用array_filter()筛选数组键?

回调函数array_filter()仅传递数组的值,而不传递键。 如果我有: $my_array = array("foo" => 1, "hello" ...
保持可爱mmm 2020-01-15 16:31:48 1 浏览量 回答数 1

问题

获取数组中项目的索引,该数组是Spark数据帧中的列

我可以通过执行以下操作,根据数组字段中是否存在特定值来过滤Spark数据帧(在PySpark中):from pyspark.sql.functions import array_containsspark_df.filter(array_c...
社区小助手 2019-12-01 19:29:10 509 浏览量 回答数 1

问题

如何在Scala中向数组添加元素,并找到变量类型?

如何在Scala中向数组添加元素,并找到变量类型?我有下面的Scala代码块作为我的数据处理管道的一部分。形成我目前所理解的,UDF接受一个file_contents类型String类型的参数。然后UDF进行一堆字符串处理,包括a spli...
社区小助手 2019-12-01 19:28:37 1588 浏览量 回答数 1

回答

将功能映射到数据数组的想法来自功能编程。您不应该将其array_map视为foreach在数组的每个元素上调用函数的循环(即使这是实现它的方式)。应该考虑将函数独立地应用于数组中的每个元素。 从理论上讲,诸如函数映射之类的事情可以并行完成,因为应用于数据的函数应该只影响数据,而不影响全局状态。这是因为array_map可以选择将功能应用到项目的顺序(即使在PHP中不是这样)。 array_walk另一方面,它是处理数据数组的完全相反的方法。它使用状态(&$userdata)而不是分别处理每个项目,并且可以就地编辑该项目(很像foreach循环)。由于每次将项目$funcname应用到它,它可能会更改程序的全局状态,因此需要一种正确的方式来处理项目。 早在PHP的土地,array_map以及array_walk几乎相同,除了array_walk让你更好地控制数据的重复,并且通常用来“改变”数据就地和回访新的“改变”阵列。 array_filter实际上是array_walk(或array_reduce)的应用程序,或多或少只是为了方便而提供的。 问题来源于stack overflow
保持可爱mmm 2020-01-15 16:26:00 0 浏览量 回答数 0

问题

wordpress 域名重定向后无法回复

// WordPress 移动端页面重定向到 MIP 独立域名add_filter('get_header', 'fanly_redirect_to');function fanly_redirect_to(){if(wp_is_mobil...
才v 2019-12-01 19:39:12 710 浏览量 回答数 0

回答

百度地图API的调用需要申请KEY,这里就不具体介绍了,直接贴上本人写了两个关键方法,为了方便前台调用,返回数据采用以下格式 { address: "北京市海淀区西二旗北路", province: "北京市", city: "北京市", street: "西二旗北路", street_number: "", city_code: 131, lng: 116.3207676804, lat: 40.064084055578 } 核心类 <?php /** * @author xialei <xialeistudio@gmail.com> */ class map { private static $_instance; const REQ_GET = 1; const REQ_POST = 2; /** * 单例模式 * @return map */ public static function instance() { if (!self::$_instance instanceof self) { self::$_instance = new self; } return self::$_instance; } /** * 执行CURL请求 * @author: xialei<xialeistudio@gmail.com> * @param $url * @param array $params * @param bool $encode * @param int $method * @return mixed */ private function async($url, $params = array(), $encode = true, $method = self::REQ_GET) { $ch = curl_init(); if ($method == self::REQ_GET) { $url = $url . '?' . http_build_query($params); $url = $encode ? $url : urldecode($url); curl_setopt($ch, CURLOPT_URL, $url); } else { curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); } curl_setopt($ch, CURLOPT_REFERER, '百度地图referer'); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $resp = curl_exec($ch); curl_close($ch); return $resp; } /** * ip定位 * @param string $ip * @return array * @throws Exception */ public function locationByIP($ip) { //检查是否合法IP if (!filter_var($ip, FILTER_VALIDATE_IP)) { throw new Exception('ip地址不合法'); } $params = array( 'ak' => '百度地图API KEY', 'ip' => $ip, 'coor' => 'bd09ll'//百度地图GPS坐标 ); $api = 'http://api.map.baidu.com/location/ip'; $resp = $this->async($api, $params); $data = json_decode($resp, true); //有错误 if ($data['status'] != 0) { throw new Exception($data['message']); } //返回地址信息 return array( 'address' => $data['content']['address'], 'province' => $data['content']['address_detail']['province'], 'city' => $data['content']['address_detail']['city'], 'district' => $data['content']['address_detail']['district'], 'street' => $data['content']['address_detail']['street'], 'street_number' => $data['content']['address_detail']['street_number'], 'city_code' => $data['content']['address_detail']['city_code'], 'lng' => $data['content']['point']['x'], 'lat' => $data['content']['point']['y'] ); } /** * GPS定位 * @param $lng * @param $lat * @return array * @throws Exception */ public function locationByGPS($lng, $lat) { $params = array( 'coordtype' => 'wgs84ll', 'location' => $lat . ',' . $lng, 'ak' => '百度地图API KEY', 'output' => 'json', 'pois' => 0 ); $resp = $this->async('http://api.map.baidu.com/geocoder/v2/', $params, false); $data = json_decode($resp, true); if ($data['status'] != 0) { throw new Exception($data['message']); } return array( 'address' => $data['result']['formatted_address'], 'province' => $data['result']['addressComponent']['province'], 'city' => $data['result']['addressComponent']['city'], 'street' => $data['result']['addressComponent']['street'], 'street_number' => $data['result']['addressComponent']['street_number'], 'city_code'=>$data['result']['cityCode'], 'lng'=>$data['result']['location']['lng'], 'lat'=>$data['result']['location']['lat'] ); } } 调用方法就不说了。
小旋风柴进 2019-12-02 02:02:32 0 浏览量 回答数 0

问题

MAP函数是什么?

cardinality(x) → bigint 返回map x的Size(大小) element_at(map<K, V>, key) → V 返回一个key的value,如果map不...
nicenelly 2019-12-01 21:26:42 1293 浏览量 回答数 0

回答

如果你没有2.4,你需要使用udf()。看一下这个: val df = Seq(Array("A", "B", "C", "D"), Array("E", "B", "C", "D")).toDF("skills")def skill_check(x:Seq[String]):Boolean = { val b = x.map( p=> Seq("A", "Z").exists( y => y==p)).filter(x=>x) if ( b.isEmpty ) false else true}val udf_skill_check = udf( skill_check(_:Seq[String]))df.withColumn("check",udf_skill_check('skills) ).filter("check").show(false)结果: skills check [A, B, C, D] true 如果您不想使用UDF,那么您可以为检查列表引入一个新列,即[“A”,“Z”},爆炸..然后检查技能是否包含爆炸项目,过滤然后删除重复项在技​​能专栏上。很麻烦,但有效 val df = Seq(Array("A", "B", "C", "D"), Array("E", "B", "C", "D")).toDF("skills")val df2 = df.withColumn("chk1",lit(Array("A","Z"))) // New columndf2.withColumn("chk2",explode('chk1)).withColumn("chk3", array_contains('skills,'chk2)).filter("chk3").select("skills").dropDuplicates().show(false) skills [A, B, C, D]
社区小助手 2019-12-02 01:51:16 0 浏览量 回答数 0

问题

让 WordPress 飞起来的几个 function

介绍 WordPress 毕竟是歪果仁开发的系统放到中国来会有一些水土不服,因为有广泛的使用到一些境外网站服务以及一些不必要的功能导致 WP 网站变慢,这里就将介绍如何通过 function.php 来精...
妙正灰 2019-12-01 21:21:58 4471 浏览量 回答数 3

问题

PHP:数组将逗号分隔的字符串转换为int

我只是试图将包含用逗号分隔的数字的数组解析为没有逗号的数字,但仍然是数组形式。但这没有用。 我的代码: $arrTot = array_filter(array_slice($total, 20));...
云产品优惠 2019-12-01 22:06:50 5 浏览量 回答数 0

问题

网站运行提示出错

开始还好好的  突然提示出现服务器错误500什么的 用IE   返回的结果提示是: PHP Warning:  Missing argument 2 for dt_f_slider_col_thumb() in D:\webs...
漂流灬 2019-12-01 21:41:46 7160 浏览量 回答数 2

回答

您可以使用scipy.ndimage.uniform_filter解决它: Uniform_filter等效于Box模糊(在您的情况下为1维Box过滤器)。 这是代码: import numpy as np import scipy.ndimage #scores = np.random.normal(-0.2,0.01,1000) scores = np.array(np.r_[1:30]).astype(float) # Initialize to values 1 to 30 (for testing) m = np.int(np.sqrt(scores.shape[0])+0.5) # m = 5 mean_scores = scipy.ndimage.uniform_filter(scores, size=m, mode='reflect', cval=0.0) sum_scores = mean_scores * m x = (scores - mean_scores / sum_scores) 回答来源:stackoverflow
is大龙 2020-03-24 19:05:39 0 浏览量 回答数 0

问题

Linux下编译opencv的cvDrawChessboardCorners函数出错

Linux下编译opencv的cvDrawChessboardCorners函数出错在linux上编译: zoegreen@zoegreen-Lenovo-IdeaPad-Y470:~/桌面/subpix_test$ g++ subpix2...
杨冬芳 2019-12-01 20:25:13 2146 浏览量 回答数 1

回答

在云栖社区的问答区,有一位网友提到有一个问题: 表里相似数据太多,想删除相似度高的数据,有什么办法能实现吗? 例如: 银屑病怎么治? 银屑病怎么治疗? 银屑病怎么治疗好? 银屑病怎么能治疗好? 等等 解这个问题的思路 .1. 首先如何判断内容的相似度,PostgreSQL中提供了中文分词,pg_trgm(将字符串切成多个不重复的token,计算两个字符串的相似度) . 对于本题,我建议采取中文分词的方式,首先将内容拆分成词组。 .2. 在拆分成词组后,首先分组聚合,去除完全重复的数据。 .3. 然后自关联生成笛卡尔(矩阵),计算出每条记录和其他记录的相似度。相似度的算法很简单,重叠的token数量除以集合的token去重后的数量。 .4. 根据相似度,去除不需要的数据。 这里如果数据量非常庞大,使用专业的分析编程语言会更好例如 PL/R。 实操的例子: 首先要安装PostgreSQL 中文分词插件 (阿里云AliCloudDB PostgreSQL已包含这个插件,用法参考官方手册) git clone https://github.com/jaiminpan/pg_jieba.git mv pg_jieba $PGSRC/contrib/ export PATH=/home/digoal/pgsql9.5/bin:$PATH cd $PGSRC/contrib/pg_jieba make clean;make;make install git clone https://github.com/jaiminpan/pg_scws.git mv pg_jieba $PGSRC/contrib/ export PATH=/home/digoal/pgsql9.5/bin:$PATH cd $PGSRC/contrib/pg_scws make clean;make;make install 创建插件 psql # create extension pg_jieba; # create extension pg_scws; 创建测试CASE create table tdup1 (id int primary key, info text); create extension pg_trgm; insert into tdup1 values (1, '银屑病怎么治?'); insert into tdup1 values (2, '银屑病怎么治疗?'); insert into tdup1 values (3, '银屑病怎么治疗好?'); insert into tdup1 values (4, '银屑病怎么能治疗好?'); 这两种分词插件,可以任选一种。 postgres=# select to_tsvector('jiebacfg', info),* from tdup1 ; to_tsvector | id | info ---------------------+----+---------------------- '治':3 '银屑病':1 | 1 | 银屑病怎么治? '治疗':3 '银屑病':1 | 2 | 银屑病怎么治疗? '治疗':3 '银屑病':1 | 3 | 银屑病怎么治疗好? '治疗':4 '银屑病':1 | 4 | 银屑病怎么能治疗好? (4 rows) postgres=# select to_tsvector('scwscfg', info),* from tdup1 ; to_tsvector | id | info -----------------------------------+----+---------------------- '治':2 '银屑病':1 | 1 | 银屑病怎么治? '治疗':2 '银屑病':1 | 2 | 银屑病怎么治疗? '好':3 '治疗':2 '银屑病':1 | 3 | 银屑病怎么治疗好? '好':4 '治疗':3 '能':2 '银屑病':1 | 4 | 银屑病怎么能治疗好? (4 rows) 创建三个函数, 计算2个数组的集合(去重后的集合) postgres=# create or replace function array_union(text[], text[]) returns text[] as $$ select array_agg(c1) from (select c1 from unnest($1||$2) t(c1) group by c1) t; $$ language sql strict; CREATE FUNCTION 数组去重 postgres=# create or replace function array_dist(text[]) returns text[] as $$ select array_agg(c1) from (select c1 from unnest($1) t(c1) group by c1) t; $$ language sql strict; CREATE FUNCTION 计算两个数组的重叠部分(去重后的重叠部分) postgres=# create or replace function array_share(text[], text[]) returns text[] as $$ select array_agg(unnest) from (select unnest($1) intersect select unnest($2) group by 1) t; $$ language sql strict; CREATE FUNCTION 笛卡尔结果是这样的: regexp_split_to_array((regexp_replace(to_tsvector('jiebacfg',info)::text,'(:d+)', '', 'g')),' ') 用于将info转换成数组。 postgres=# with t(c1,c2,c3) as (select id,info,array_dist(regexp_split_to_array((regexp_replace(to_tsvector('jiebacfg',info)::text,'(:\d+)', '', 'g')),' ')) from tdup1) select * from (select t1.c1 t1c1,t2.c1 t2c1,t1.c2 t1c2,t2.c2 t2c2,t1.c3 t1c3,t2.c3 t2c3,round(array_length(array_share(t1.c3,t2.c3),1)::numeric/array_length(array_union(t1.c3,t2.c3),1),2) simulate from t t1,t t2) t; t1c1 | t2c1 | t1c2 | t2c2 | t1c3 | t2c3 | simulate ------+------+----------------------+----------------------+-------------------+-------------------+---------- 1 | 1 | 银屑病怎么治? | 银屑病怎么治? | {'银屑病','治'} | {'银屑病','治'} | 1.00 1 | 2 | 银屑病怎么治? | 银屑病怎么治疗? | {'银屑病','治'} | {'银屑病','治疗'} | 0.33 1 | 3 | 银屑病怎么治? | 银屑病怎么治疗好? | {'银屑病','治'} | {'银屑病','治疗'} | 0.33 1 | 4 | 银屑病怎么治? | 银屑病怎么能治疗好? | {'银屑病','治'} | {'银屑病','治疗'} | 0.33 2 | 1 | 银屑病怎么治疗? | 银屑病怎么治? | {'银屑病','治疗'} | {'银屑病','治'} | 0.33 2 | 2 | 银屑病怎么治疗? | 银屑病怎么治疗? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 2 | 3 | 银屑病怎么治疗? | 银屑病怎么治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 2 | 4 | 银屑病怎么治疗? | 银屑病怎么能治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 3 | 1 | 银屑病怎么治疗好? | 银屑病怎么治? | {'银屑病','治疗'} | {'银屑病','治'} | 0.33 3 | 2 | 银屑病怎么治疗好? | 银屑病怎么治疗? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 3 | 3 | 银屑病怎么治疗好? | 银屑病怎么治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 3 | 4 | 银屑病怎么治疗好? | 银屑病怎么能治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 4 | 1 | 银屑病怎么能治疗好? | 银屑病怎么治? | {'银屑病','治疗'} | {'银屑病','治'} | 0.33 4 | 2 | 银屑病怎么能治疗好? | 银屑病怎么治疗? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 4 | 3 | 银屑病怎么能治疗好? | 银屑病怎么治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 4 | 4 | 银屑病怎么能治疗好? | 银屑病怎么能治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 (16 rows) 以上生成的实际上是一个矩阵,simulate就是矩阵中我们需要计算的相似度: 我们在去重计算时不需要所有的笛卡尔积,只需要这个矩阵对角线的上部分或下部分数据即可。 所以加个条件就能完成。 postgres=# with t(c1,c2,c3) as (select id,info,array_dist(regexp_split_to_array((regexp_replace(to_tsvector('jiebacfg',info)::text,'(:\d+)', '', 'g')),' ')) from tdup1) select * from (select t1.c1 t1c1,t2.c1 t2c1,t1.c2 t1c2,t2.c2 t2c2,t1.c3 t1c3,t2.c3 t2c3,round(array_length(array_share(t1.c3,t2.c3),1)::numeric/array_length(array_union(t1.c3,t2.c3),1),2) simulate from t t1,t t2 where t1.c1<>t2.c1 and t1.c1<t2.c1) t; t1c1 | t2c1 | t1c2 | t2c2 | t1c3 | t2c3 | simulate ------+------+--------------------+----------------------+-------------------+-------------------+---------- 1 | 2 | 银屑病怎么治? | 银屑病怎么治疗? | {'银屑病','治'} | {'银屑病','治疗'} | 0.33 1 | 3 | 银屑病怎么治? | 银屑病怎么治疗好? | {'银屑病','治'} | {'银屑病','治疗'} | 0.33 1 | 4 | 银屑病怎么治? | 银屑病怎么能治疗好? | {'银屑病','治'} | {'银屑病','治疗'} | 0.33 2 | 3 | 银屑病怎么治疗? | 银屑病怎么治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 2 | 4 | 银屑病怎么治疗? | 银屑病怎么能治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 3 | 4 | 银屑病怎么治疗好? | 银屑病怎么能治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 (6 rows) 开始对这些数据去重,去重的第一步,明确simulate, 例如相似度大于0.5的,需要去重。 postgres=# with t(c1,c2,c3) as (select id,info,array_dist(regexp_split_to_array((regexp_replace(to_tsvector('jiebacfg',info)::text,'(:\d+)', '', 'g')),' ')) from tdup1) select * from (select t1.c1 t1c1,t2.c1 t2c1,t1.c2 t1c2,t2.c2 t2c2,t1.c3 t1c3,t2.c3 t2c3,round(array_length(array_share(t1.c3,t2.c3),1)::numeric/array_length(array_union(t1.c3,t2.c3),1),2) simulate from t t1,t t2 where t1.c1<>t2.c1 and t1.c1<t2.c1) t where simulate>0.5; t1c1 | t2c1 | t1c2 | t2c2 | t1c3 | t2c3 | simulate ------+------+--------------------+----------------------+-------------------+-------------------+---------- 2 | 3 | 银屑病怎么治疗? | 银屑病怎么治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 2 | 4 | 银屑病怎么治疗? | 银屑病怎么能治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 3 | 4 | 银屑病怎么治疗好? | 银屑病怎么能治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 (3 rows) 去重第二步,将t2c1列的ID对应的记录删掉即可。 delete from tdup1 where id in (with t(c1,c2,c3) as (select id,info,array_dist(regexp_split_to_array((regexp_replace(to_tsvector('jiebacfg',info)::text,'(:\d+)', '', 'g')),' ')) from tdup1) select t2c1 from (select t1.c1 t1c1,t2.c1 t2c1,t1.c2 t1c2,t2.c2 t2c2,t1.c3 t1c3,t2.c3 t2c3,round(array_length(array_share(t1.c3,t2.c3),1)::numeric/array_length(array_union(t1.c3,t2.c3),1),2) simulate from t t1,t t2 where t1.c1<>t2.c1 and t1.c1<t2.c1) t where simulate>0.5); 例如 : postgres=# insert into tdup1 values (11, '白血病怎么治?'); INSERT 0 1 postgres=# insert into tdup1 values (22, '白血病怎么治疗?'); INSERT 0 1 postgres=# insert into tdup1 values (13, '白血病怎么治疗好?'); INSERT 0 1 postgres=# insert into tdup1 values (24, '白血病怎么能治疗好?'); INSERT 0 1 postgres=# postgres=# with t(c1,c2,c3) as (select id,info,array_dist(regexp_split_to_array((regexp_replace(to_tsvector('jiebacfg',info)::text,'(:\d+)', '', 'g')),' ')) from tdup1) select * from (select t1.c1 t1c1,t2.c1 t2c1,t1.c2 t1c2,t2.c2 t2c2,t1.c3 t1c3,t2.c3 t2c3,round(array_length(array_share(t1.c3,t2.c3),1)::numeric/array_length(array_union(t1.c3,t2.c3),1),2) simulate from t t1,t t2 where t1.c1<>t2.c1 and t1.c1<t2.c1) t where simulate>0.5; t1c1 | t2c1 | t1c2 | t2c2 | t1c3 | t2c3 | simulate ------+------+--------------------+----------------------+-------------------+-------------------+---------- 2 | 3 | 银屑病怎么治疗? | 银屑病怎么治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 2 | 4 | 银屑病怎么治疗? | 银屑病怎么能治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 3 | 4 | 银屑病怎么治疗好? | 银屑病怎么能治疗好? | {'银屑病','治疗'} | {'银屑病','治疗'} | 1.00 22 | 24 | 白血病怎么治疗? | 白血病怎么能治疗好? | {'治疗','白血病'} | {'治疗','白血病'} | 1.00 13 | 22 | 白血病怎么治疗好? | 白血病怎么治疗? | {'治疗','白血病'} | {'治疗','白血病'} | 1.00 13 | 24 | 白血病怎么治疗好? | 白血病怎么能治疗好? | {'治疗','白血病'} | {'治疗','白血病'} | 1.00 (6 rows) postgres=# begin; BEGIN postgres=# delete from tdup1 where id in (with t(c1,c2,c3) as postgres(# (select id,info,array_dist(regexp_split_to_array((regexp_replace(to_tsvector('jiebacfg',info)::text,'(:\d+)', '', 'g')),' ')) from tdup1) postgres(# select t2c1 from (select t1.c1 t1c1,t2.c1 t2c1,t1.c2 t1c2,t2.c2 t2c2,t1.c3 t1c3,t2.c3 t2c3,round(array_length(array_share(t1.c3,t2.c3),1)::numeric/array_length(array_union(t1.c3,t2.c3),1),2) postgres(# simulate from t t1,t t2 where t1.c1<>t2.c1 and t1.c1<t2.c1) t where simulate>0.5); DELETE 4 postgres=# select * from tdup1 ; id | info ----+-------------------- 1 | 银屑病怎么治? 2 | 银屑病怎么治疗? 11 | 白血病怎么治? 13 | 白血病怎么治疗好? (4 rows) 用数据库解会遇到的问题, 因为我们的JOIN filter是<>和<,用不上hashjoin。 数据量比较大的情况下,耗时会非常的长。 postgres=# explain delete from tdup1 where id in (with t(c1,c2,c3) as (select id,info,array_dist(regexp_split_to_array((regexp_replace(to_tsvector('jiebacfg',info)::text,'(:\d+)', '', 'g')),' ')) from tdup1) select t2c1 from (select t1.c1 t1c1,t2.c1 t2c1,t1.c2 t1c2,t2.c2 t2c2,t1.c3 t1c3,t2.c3 t2c3,round(array_length(array_share(t1.c3,t2.c3),1)::numeric/array_length(array_union(t1.c3,t2.c3),1),2) simulate from t t1,t t2 where t1.c1<>t2.c1 and t1.c1<t2.c1) t where simulate>0.5); QUERY PLAN ---------------------------------------------------------------------------------------------------------------------- Delete on tdup1 (cost=10005260133.58..10005260215.84 rows=2555 width=34) -> Hash Join (cost=10005260133.58..10005260215.84 rows=2555 width=34) Hash Cond: (tdup1.id = "ANY_subquery".t2c1) -> Seq Scan on tdup1 (cost=0.00..61.10 rows=5110 width=10) -> Hash (cost=10005260131.08..10005260131.08 rows=200 width=32) -> HashAggregate (cost=10005260129.08..10005260131.08 rows=200 width=32) Group Key: "ANY_subquery".t2c1 -> Subquery Scan on "ANY_subquery" (cost=10000002667.20..10005252911.99 rows=2886838 width=32) -> Subquery Scan on t (cost=10000002667.20..10005224043.61 rows=2886838 width=4) Filter: (t.simulate > 0.5) CTE t -> Seq Scan on tdup1 tdup1_1 (cost=0.00..2667.20 rows=5110 width=36) -> Nested Loop (cost=10000000000.00..10005113119.99 rows=8660513 width=68) Join Filter: ((t1.c1 <> t2.c1) AND (t1.c1 < t2.c1)) -> CTE Scan on t t1 (cost=0.00..102.20 rows=5110 width=36) -> CTE Scan on t t2 (cost=0.00..102.20 rows=5110 width=36) (16 rows) 其他更优雅的方法,使用PLR或者R进行矩阵运算,得出结果后再进行筛选。 PLR R 或者使用MPP数据库例如Greenplum加上R和madlib可以对非常庞大的数据进行处理。 MADLIB MPP 小结 这里用到了PG的什么特性? .1. 中文分词 .2. 窗口查询功能 (本例中没有用到,但是如果你的数据没有主键时,则需要用ctid和row_number来定位到一条唯一记录)
德哥 2019-12-02 01:43:06 0 浏览量 回答数 0

问题

qt上编译opencv程序出错

编译提取棋盘格角点的的程序,但是一直显示cvFindChessboardCorners这个函数有问题,请大神指教!错误如下: ../qt_subpix1/main.cpp: In function 'int main(int, char*...
杨冬芳 2019-12-01 20:25:15 1742 浏览量 回答数 1

问题

在结帐页面上更改计费字段的顺序

我正在使用WC过滤器来订购帐单字段 筛选器似乎工作正常,但由于未知原因,它会即时恢复为默认顺序。 add_filter("woocommerce_checkout_fields", "...
几许相思几点泪 2019-12-23 17:51:51 0 浏览量 回答数 0

回答

这是有效的代码: require 'csv'require 'json'require 'set' def get_recursive_keys(hash, nested_key=nil) hash.each_with_object([]) do |(k,v),keys| # Col filter next if ["score", "original_name"].include? k k = "#{nested_key}.#{k}" unless nested_key.nil? if v.is_a? Hash keys.concat(get_recursive_keys(v, k)) else keys << k end endend json = JSON.parse(File.open(ARGV[0]).read)headings = Set.newheadings = get_recursive_keys(json) headings = headings.to_a Header sorting headings = headings.sort { |a, b| a <=> b } CSV.open(ARGV[0] + '.csv', 'w') do |csv| csv << headings row = headings.map do |h| v = (h.split('.').length > 1) ? json.dig(*h.split('.')) : h v.is_a?(Array) ? v.join(',') : v end csv << rowend我测试了这个小的json字符串:{“score”:“12”,“name”:“Obi”,“original_name”:“Wan Kenobi”,“something”:{“sub_key”:“Wuhu”}}
小六码奴 2019-12-02 02:01:21 0 浏览量 回答数 0

问题

Python:在Postgres中插入大型dataframe (1.2M行)的问题

我使用panda插入方法(https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method)来获取从.mdb文件转换而来的csv并将它们插入到Post...
kun坤 2019-12-30 09:34:45 0 浏览量 回答数 0

问题

Wordpress附件上传到OSS存储SDK应用实例

OSS 作为开放存储服务,其最大的作用就是作为一个大仓库来存放你所有的静态文件。这其中应用最多的场景就是作为图床。期初我感觉阿里云 OSS 结合自身网站并不是那么特别简单就能实现,不过现在利用官方的 SDK 开发...
bailimei 2019-12-01 21:49:26 12778 浏览量 回答数 6

回答

生成数组以后可以用array_filter过滤元素 上面的函数是可以求元素交集的,但有些小问题,改了两个地方: function my_array_intersect( $a, $b ) { for ( $i = 0; $i<sizeof( $a ); $i++ ) { $m[] = $a[$i]; } for ( $i = 0; $i<sizeof( $b ); $i++ ) { $m[] = $b[$i]; } sort( $m ); $get = array(); for ( $i = 0; $i<sizeof( $m )-1; $i++ ) { if ( $m[$i]==$m[$i+1] ) { $get[] = $m[$i]; } } return array_unique($get); } var_dump(my_array_intersect( array(2,3,3,6), array(3,9,8,2) )); glob()函数可以扫描指定目录下的特定类型文件,相当于linux下的find命令和win的文件搜索。scandir()可以列出一个目录下的所有文件,它们都是以数组返回。 第二个问题,用文件名和ctime时间都可以,看对准确性的要求了,因为构造出文件名到文件写入完成之间有极短的时间间隔,如果文件很大甚至会有若干秒的时间间隔,或者这个文件在写入时遇到了另一个进程的写锁导致写入延迟 ,这些时间很有想象空间。 ###### 引用来自“朱亚杰”的答案 生成数组以后可以用array_filter过滤元素 上面的函数是可以求元素交集的,但有些小问题,改了两个地方: function my_array_intersect( $a, $b ) { for ( $i = 0; $i<sizeof( $a ); $i++ ) { $m[] = $a[$i]; } for ( $i = 0; $i<sizeof( $b ); $i++ ) { $m[] = $b[$i]; } sort( $m ); $get = array(); for ( $i = 0; $i<sizeof( $m )-1; $i++ ) { if ( $m[$i]==$m[$i+1] ) { $get[] = $m[$i]; } } return array_unique($get); } var_dump(my_array_intersect( array(2,3,3,6), array(3,9,8,2) )); glob()函数可以扫描指定目录下的特定类型文件,相当于linux下的find命令和win的文件搜索。scandir()可以列出一个目录下的所有文件,它们都是以数组返回。 第二个问题,用文件名和ctime时间都可以,看对准确性的要求了,因为构造出文件名到文件写入完成之间有极短的时间间隔,如果文件很大甚至会有若干秒的时间间隔,或者这个文件在写入时遇到了另一个进程的写锁导致写入延迟 ,这些时间很有想象空间。 目前先用glob实现了,再考虑ctime时间对比看看。 现在我有一些可能的想法:整个逻辑是这样: 1,打开页面后首先从文件目录里读取当前小时内的日志内容并存放到一变量里输出 2,用户输入日志,生成日志文件后,日志内容同时在一变量里存放。并输出 这样只有初次打开页面时候才涉及到文件操作,这样速度会不会更快?但是如果日志数量特别大,持续运行时间很长的话,要定时释放变量这样可能靠谱点。 元芳,你怎么看? ######如果要求严格,用ctime不是折腾自己么?有远一点的免费高速,就别抄那坑哇的近道
一枚小鲜肉帅哥 2020-06-23 13:08:25 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT