朋友问我一个PHP的问题,自己不会,所以跑来问大家!!

paullbm 2012-04-18 11:02:11
由于自己是搞JAVA的,但朋友问我一个PHP问题,内容如下:

$testArr = array(
'php' => array(
'author' => 'allen',
'price' => 40,
),
'java' => array(
'author' => 'james',
'price' => 55,
),
'mysql' => array(
'author' => 'gates',
'price' => 30,
),
'html' => array(
'author' => 'bill',
'price' => 21,
)
);


请问如何按价格字段进行排序??
借助库函数解决也行!!
...全文
476 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
paullbm 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]
搞java,php的,让搞c的看了会笑死。
[/Quote]

这有何笑的???
qq120848369 2012-04-20
  • 打赏
  • 举报
回复
topK问题有O(n)算法,C++ STL的nth_element,算法原理就是quicksort的partion函数的应用,以上还都是排序,复杂度略高一点了,nlgn是打不住的,数据量到一定大小的时候和nth_element的差距就非常大了,不仅仅是20ms的问题了,而是一个全量计算和少量计算的问题。

另外也有构造大小根堆逐一pop堆顶的办法,或者构造平衡二叉树顺序遍历的办法,对于php来说,个人感觉nth_element可以实现,建堆也可以实现,平衡二叉树就免了,因为它丫的得写类,还得用&,很烦躁。

我发现了,不同的语言开发者都会很熟练库函数,并且有自己总结的一套解决类似问题的方法,百度了一下大哥用的php函数,又学习了,还真木有见过匿名函数和php lamba(这里create_function算lamba吧,只有return)。
xuzuning 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

create_function有内存泄漏问题,不能用在循环

引用 10 楼 的回复:

楼上几位共使用了两种类型的三种方法
对比如下PHP code
$testArr = array(
'php' => array(
'author' => 'allen',
'price' => 40,
),
'java' => array(
'author' => 'james',……
[/Quote]那你的意思就是只能用一次?
一起混吧 2012-04-19
  • 打赏
  • 举报
回复
foreach ($testArr as $v) {
$k[] = $v['price'];
}
array_multisort($k, SORT_DESC,$testArr);
print_r(array_slice($testArr,0,3));
helloyou0 2012-04-19
  • 打赏
  • 举报
回复
create_function有内存泄漏问题,不能用在循环

[Quote=引用 10 楼 的回复:]

楼上几位共使用了两种类型的三种方法
对比如下PHP code
$testArr = array(
'php' => array(
'author' => 'allen',
'price' => 40,
),
'java' => array(
'author' => 'james',
'price' => ……
[/Quote]
  • 打赏
  • 举报
回复
内存还有负数吗
helloyou0 2012-04-19
  • 打赏
  • 举报
回复
不会啊, 我以前就搞C, 现在搞php, 没有被以前的我笑死啊

[Quote=引用 25 楼 的回复:]

搞java,php的,让搞c的看了会笑死。
[/Quote]
xuzuning 2012-04-19
  • 打赏
  • 举报
回复
$ar = array(
'php' => array(
'author' => 'allen',
'price' => 40,
),
'java' => array(
'author' => 'james',
'price' => 55,
),
'mysql' => array(
'author' => 'gates',
'price' => 30,
),
'html' => array(
'author' => 'bill',
'price' => 21,
),
);

function func($ar) {
$r = array(0);
foreach($ar as $k=>$v) {
if($v['price'] > min($r)) $r[$k] = $v['price'];
if(count($r) > 3) unset($r[array_search(min($r), $r)]);
}
}

check_speed(200, 'func', $ar);
func
时间: 6 微秒
内存: -8
helloyou0 2012-04-19
  • 打赏
  • 举报
回复
以前在帖子里说过,
http://php.net/manual/en/function.create-function.php
手册这里的回复里有好几条是关于这个泄漏问题的.

bugs这里有问题及相关回复:
https://bugs.php.net/bug.php?id=6333

实际就是create_function每次都建一个隐藏的函数,但是不会(无法)去注销过去建的同样函数,
于是每次都增加点内存使用

一般的网页里不会有太大问题,因为运行很快结束并释放所有内存.

但是在长时间运行的脚本里会有问题,
我第一次注意到这个就是在一个抓网页的脚本里,因为要抓很多页面,会运行很长时间,
php5.3后用新的匿名函数就没问题了 (因为那个实际是一个closure类,不会重复建函数)


[Quote=引用 21 楼 的回复:]

引用 17 楼 的回复:

create_function有内存泄漏问题,不能用在循环

引用 10 楼 的回复:

楼上几位共使用了两种类型的三种方法
对比如下PHP code
$testArr = array(
'php' => array(
'author' => 'allen',
'price' => 40,
),
'java' => array(
'au……
[/Quote]
amani11 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

楼上几位共使用了两种类型的三种方法
对比如下PHP code
$testArr = array(
'php' => array(
'author' => 'allen',
'price' => 40,
),
'java' => array(
'author' => 'james',
'price' => ……
[/Quote]


不能吧,uasort这么不堪?

另外,维护一个最小堆,遍历一遍即可,如果数据源足够大的话,自写函数是划算的。。。。语言不同,算法确一般
一起混吧 2012-04-19
  • 打赏
  • 举报
回复
上面回复已经有答案了啊。
paullbm 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
如果数组狂大,只需要前3名的话,排序不合算,
可以用array_filter 或者 array_map过滤出前3名....

代码? ..... 嗯, 我今日小懒, 楼下那谁, 麻烦写下, 谢谢


引用 6 楼 的回复:

补充:
当前数组中只有3个数组,如果有10个或更多,要求排序后只返回价格前3名的呢??
[/Quote]

功能就是希望先排序,后找出前几个(可能是前3,也可能是前5.。。)最高价的!!
paullbm 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]
搞java,php的,让搞c的看了会笑死。
[/Quote]

O
paullbm 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]
引用 23 楼 的回复:

引用 20 楼 的回复:
这样是不行的
1、丢失了分类键,即结构发生了变化
2、如果排序键的值相同,会只保留一组


何意?愿闻其详!


PHP code

$testArr = array( 'php' => array( 'author' => 'allen', 'price' => 40, ), 'java' => array( 'au……
[/Quote]

当然不是。数据结构应该保持不变啊,只是顺序变了而已!
coder 2012-04-19
  • 打赏
  • 举报
回复
搞java,php的,让搞c的看了会笑死。
xuzuning 2012-04-19
  • 打赏
  • 举报
回复
楼上几位共使用了两种类型的三种方法
对比如下
$testArr = array(
'php' => array(
'author' => 'allen',
'price' => 40,
),
'java' => array(
'author' => 'james',
'price' => 55,
),
'mysql' => array(
'author' => 'gates',
'price' => 30,
),
'html' => array(
'author' => 'bill',
'price' => 21,
)
);

/*** 应用回调函数 ***/
function func1($ar) {
uasort($ar, create_function('$a,$b', 'return $a["price"]>$b["price"];'));//价格升序,降序改成<
}

/*** 不使用回调函数 ***/
function func2($ar) {
foreach ($ar as $key => $row) {
$price[$key] = $row['price'];
}
array_multisort($price, SORT_ASC,$ar);
}

/*** 应用 php5.3 闭包 ***/
function func3($ar) {
array_multisort(array_map(function($v){return $v['price'];},$ar),$ar);
}
check_speed(200, 'func2', $testArr);
check_speed(200, 'func3', $testArr);
check_speed(200, 'func1', $testArr);

200次运行的平均耗时

func2
时间: 5 微秒
内存: 0

func3
时间: 6 微秒
内存: 88

func1
时间: 20 微秒
内存: 214656
xuzuning 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]

引用 20 楼 的回复:
这样是不行的
1、丢失了分类键,即结构发生了变化
2、如果排序键的值相同,会只保留一组


何意?愿闻其详!
[/Quote]
$testArr = array( 'php' => array( 'author' => 'allen', 'price' => 40, ), 'java' => array( 'author' => 'james', 'price' => 55, ), 'mysql' => array( 'author' => 'gates', 'price' => 30, ), 'html' => array( 'author' => 'bill', 'price' => 21, ) );

foreach ($testArr as $key=>$val)
$_testArr[$val['price']] = $val;
ksort($_testArr);
print_r($_testArr);
Array
(
[21] => Array
(
[author] => bill
[price] => 21
)

[30] => Array
(
[author] => gates
[price] => 30
)

[40] => Array
(
[author] => allen
[price] => 40
)

[55] => Array
(
[author] => james
[price] => 55
)

)

这是你期望得到的结果吗
paullbm 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
这样是不行的
1、丢失了分类键,即结构发生了变化
2、如果排序键的值相同,会只保留一组
[/Quote]

何意?愿闻其详!
ci1699 2012-04-19
  • 打赏
  • 举报
回复
改了下=_=......
这样写好像很土,php array函数好多,我常用就那么几个= =




foreach ($testArr as $key=>$val)
{
$val['key'] = $key;
$_testArr[$val['price'].$key] = $val;
}
ksort($_testArr);

$testArr = array();
foreach ($_testArr as $key=>$val)
{
unset($val['key']);
$testArr[$_testArr[$key]['key']] = $val;
}
print_r($testArr);




[Quote=引用 20 楼 的回复:]

引用 19 楼 的回复:

PHP code


$testArr = array( 'php' => array( 'author' => 'allen', 'price' => 40, ), 'java' => array( 'author' => 'james', 'price' => 55, ), 'mysql' => array( 'author' => 'gates', ……
[/Quote]
foolbirdflyfirst 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

create_function有内存泄漏问题,不能用在循环

引用 10 楼 的回复:

楼上几位共使用了两种类型的三种方法
对比如下PHP code
$testArr = array(
'php' => array(
'author' => 'allen',
'price' => 40,
),
'java' => array(
'author' => 'james',……
[/Quote]
对这个create_function内存泄漏案例很感兴趣,有写blog吗?弄个链接来学习一下。
加载更多回复(10)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧