由于自己是搞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,
)
);
请问如何按价格字段进行排序??
借助库函数解决也行!!

解决方案 »

  1.   

    嗯,你是搞JAVA的,价格最贵啊
    uasort($testArr, create_function('$a,$b', 'return $a["price"]>$b["price"];'));//价格升序,降序改成<
      

  2.   


    <?
    $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 my_sort($a, $b){
      return $a['price'] > $b['price'];
    }
    uasort($testArr, "my_sort");
    print_r($testArr);
    ?>
      

  3.   


    $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 => $row) {
        $names[$key] = $row['author'];
        $price[$key] = $row['price'];
    }array_multisort($price, SORT_ASC,$testArr);
    print_R($testArr);
      

  4.   

    <?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,));
    array_multisort(array_map(function($v){return $v['price'];},$testArr),$testArr);
    print_r($testArr);也来凑个热闹~
      

  5.   


    <?
    $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 my_sort($a, $b){
      return $a['price'] < $b['price'];
    }
    uasort($testArr, "my_sort");
    $testArr = array_slice($testArr, 0, 3);
    print_r($testArr);
    ?>
      

  6.   

    foreach ($testArr as $v) {
        $k[] = $v['price'];
    }
    array_multisort($k, SORT_DESC,$testArr);
    print_r(array_slice($testArr,0,3));
      

  7.   

    如果数组狂大,只需要前3名的话,排序不合算,
    可以用array_filter 或者 array_map过滤出前3名....代码? ..... 嗯, 我今日小懒, 楼下那谁, 麻烦写下, 谢谢
      

  8.   

    楼上几位共使用了两种类型的三种方法
    对比如下$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 微秒
    内存: 0func3
    时间: 6 微秒
    内存: 88func1
    时间: 20 微秒
    内存: 214656
      

  9.   

    不能吧,uasort这么不堪?另外,维护一个最小堆,遍历一遍即可,如果数据源足够大的话,自写函数是划算的。语言不同,算法确一般
      

  10.   

    $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
      

  11.   

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

  12.   

    $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);怎么不这么写,不是很快么。
      

  13.   

    对这个create_function内存泄漏案例很感兴趣,有写blog吗?弄个链接来学习一下。
      

  14.   

    改了下=_=......
    这样写好像很土,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);
      

  15.   

    $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
            ))这是你期望得到的结果吗
      

  16.   

    搞java,php的,让搞c的看了会笑死。
      

  17.   

    以前在帖子里说过, 
    http://php.net/manual/en/function.create-function.php 
    手册这里的回复里有好几条是关于这个泄漏问题的.bugs这里有问题及相关回复:
    https://bugs.php.net/bug.php?id=6333实际就是create_function每次都建一个隐藏的函数,但是不会(无法)去注销过去建的同样函数, 
    于是每次都增加点内存使用一般的网页里不会有太大问题,因为运行很快结束并释放所有内存.但是在长时间运行的脚本里会有问题,
    我第一次注意到这个就是在一个抓网页的脚本里,因为要抓很多页面,会运行很长时间,
    php5.3后用新的匿名函数就没问题了 (因为那个实际是一个closure类,不会重复建函数)
      

  18.   

    不会啊, 我以前就搞C, 现在搞php, 没有被以前的我笑死啊
      

  19.   

    topK问题有O(n)算法,C++ STL的nth_element,算法原理就是quicksort的partion函数的应用,以上还都是排序,复杂度略高一点了,nlgn是打不住的,数据量到一定大小的时候和nth_element的差距就非常大了,不仅仅是20ms的问题了,而是一个全量计算和少量计算的问题。另外也有构造大小根堆逐一pop堆顶的办法,或者构造平衡二叉树顺序遍历的办法,对于php来说,个人感觉nth_element可以实现,建堆也可以实现,平衡二叉树就免了,因为它丫的得写类,还得用&,很烦躁。我发现了,不同的语言开发者都会很熟练库函数,并且有自己总结的一套解决类似问题的方法,百度了一下大哥用的php函数,又学习了,还真木有见过匿名函数和php lamba(这里create_function算lamba吧,只有return)。