php处理集合数据 phplist

如何利用php数组对百万数据进行排重

如果你已经使用了一段时间PHP的话,那么,你应该已经对它的数组比较熟悉了——这种数据结构允许你在单个变量中存储多个值,并且可以把它们作为一个集合进行操作。

创新互联是一家专业提供掇刀企业网站建设,专注与网站制作、网站设计、H5技术、小程序制作等业务。10年已为掇刀众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。

经常,开发人员发现在PHP中使用这种数据结构对值或者数组元素进行排序非常有用。PHP提供了一些适合多种数组的排序函数,这些函数允许你在数组内部对元素进行排列,也允许用很多不同的方法对它们进行重新排序。在这篇文章中我们将讨论该排序中最重要的几个函数。

简单排序

首先,让我们来看看最简单的情况:将一个数组元素从低到高进行简单排序,这个函数既可以按数字大小排列也可以按字母顺序排列。PHP的sort()函数实现了这个功能,如Listing A所示:

Listing A

?php

 $data = array(5,8,1,7,2);

 sort($data);

 print_r($data);

 ?

输出结果如下所示:

Array ([0] = 1

[1] = 2

[2] = 5

[3] = 7

[4] = 8

)

为什么我用php查询mongodb数据库中的某个集合中的文档的条数,得到的结果和实际情况不一致?

我也遇到过:

官方文档解释了这种现象的原因以及解决方法:

不准确的原因:

操作的是分片的集合(前提);

shard分片正在做块迁移,导致有重复数据出现

存在孤立文档(因为不正常关机、块迁移失败等原因导致)

解决方法

使用聚合aggregate的方式查询count数量,shell命令如下:

db.collection.aggregate(

[

{ $group: { _id: null, count: { $sum: 1 } } }

])

也可以直接将原数据导出,将表删除后重新导入就可以了(我是这么处理的)

在PHP中怎么解决大量数据处理的问题

mysql_query函数查询的方式是查询出全部结果后缓存到内存中,这样就会出现超内存的现象,使用另外一个函数mysql_unbuffered_query可以解决这个问题,mysql_unbuffered_query不会缓存结果集,而是查询出来数据后立马对结果集进行操作,也就是便查询边返回,这样就不会出现超出内存的现象,但是使用mysql_unbuffered_query的是时候不能使用 mysql_num_rows() 和 mysql_data_seek()。并且向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。例如:

使用缓存结果集的代码:

function selecttest()

{

try {

$pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');

// 不使用缓存结果集方式

// $pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$sth = $pdo-prepare('select * from test');

$sth-execute();

echo '最初占用内存大小:' . memory_get_usage() . "\n";

$i = 0;

while ($result = $sth-fetch(PDO::FETCH_ASSOC)) {

$i += 1;

if ($i 10) {

break;

}

sleep(1);

print_r($result);

echo '占用内存大小:' . memory_get_usage() . "\n";

}

} catch (Exception $e) {

echo $e-getMessage();

}

}

执行时将会报超出内存的错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes) in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 56

Call Stack:

0.0005 135392 1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0

0.0005 135568 2. test-selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:85

0.0050 142528 3. PDOStatement-execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:56

将上面代码中的$pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);一行的注释去掉后将不在缓存结果集,这时运行该函数的结果如下:

最初占用内存大小:144808

Array

(

[id] = 1

[a] = v

[b] = w

[c] = i

)

占用内存大小:145544

Array

(

[id] = 2

[a] = b

[b] = l

[c] = q

)

占用内存大小:145544

Array

(

[id] = 3

[a] = m

[b] = p

[c] = h

)

占用内存大小:145536

Array

(

[id] = 4

[a] = j

[b] = i

[c] = b

)

占用内存大小:145536

可以看到,这时返回一条数据内存占用非常的小,也就700多字节,这样就不会出现超出内存的错误了。

php/shell/mysql 解决排列组合问题, 从现有数据集合提取部分数据并满足以下条件。

假如名称数量的数据是存在一个文件 file.dat 中的

使用shell语言可以这样写

./tongji.awk rows=参数1 sum=参数2 file.dat

这样就可以把所有的组合打印出来了,已经过测试了

上面这句可以根据需要,写shell函数包装起来

tongji.awk 代码如下:

#!/bin/awk -f

BEGIN{}

{

a[$1]=$2;

}

END{

choose(rows,sum,a);

}

# i为所行数

# x为总和

# array为数组

function choose(i,x,array)

{

if(i==1){

for(one in array){

if(array[one]==(x-count[2]) rep[one]!=1){

if(temp[2]!="")

print "["temp[(i+1)]",""["one","array[one]"]]";

else

print "["one","array[one]"]";

}

}

}

else{

for(one in array){

count[i]=0;

if(array[one](x-count[i]) rep[one]!=1){

count[i]=count[i+1]+array[one];

rep[one]=1;

if(temp[i+1]!=""){

temp[i]=temp[i+1]",["one","array[one]"]";

}

else{

temp[i]="["one","array[one]"]";

}

choose((i-1),x,array);

}

}

}

}


网页名称:php处理集合数据 phplist
转载注明:http://myzitong.com/article/dopiphc.html