【问题标题】:How to sort an SplFixedArray?如何对 SplFixedArray 进行排序?
【发布时间】:2013-07-21 14:54:10
【问题描述】:

有没有办法对SplFixedArray 类的实例中的整数或字符串进行排序?转换为 PHP 的array,排序,然后转换回来是唯一的选择吗?

【问题讨论】:

  • 是的。 PHP 的原生排序函数不适用于对象数组。您需要上述解决方法或一些手动编码:phppowercoding.com/…

标签: php arrays sorting spl


【解决方案1】:

首先,恭喜您找到并使用了 SplFixedArrays!我认为它们是原版 PHP 中一个未被充分利用的功能......

正如您可能已经意识到的那样,它们的性能是无与伦比的(与通常的 PHP 数组相比)——但这确实需要一些权衡,包括缺少对它们进行排序的 PHP 函数(这很遗憾)!

实现您自己的冒泡排序是一种相对简单且有效的解决方案。只需遍历,查看每对连续的元素,将最高的放在右边。冲洗并重复,直到数组排序:

<?php
$arr = new SplFixedArray(10);
$arr[0] = 2345;
$arr[1] = 314;
$arr[2] = 3666;
$arr[3] = 93;
$arr[4] = 7542;
$arr[5] = 4253;
$arr[6] = 2343;
$arr[7] = 32;
$arr[8] = 6324;
$arr[9] = 1;

$moved = 0;
while ($moved < sizeof($arr) - 1) {
    $i = 0;
    while ($i < sizeof($arr) - 1 - $moved) {
        if ($arr[$i] > $arr[$i + 1]) {
            $tmp = $arr[$i + 1];
            $arr[$i + 1] = $arr[$i];
            $arr[$i] = $tmp;
        }
        $i++;

        var_dump ($arr);
    }
    $moved++;
}

速度不快,效率不高。为此,您可能会考虑使用 Quicksort - 在线有文档示例,包括 wikibooks.org 的示例(需要修改 以使用 SplFixedArrays)。

说真的,除了回答你的问题之外,我真的觉得强迫自己问为什么存在像 SplFixedArray 这样的东西并强迫自己理解“快速致电array_sort()”背后发生了什么(以及为什么它很快需要一个非常运行时间长)使程序员和程序员有所不同。我为你的问题鼓掌!

【讨论】:

  • SplFixedArray 盲目使用冒泡排序可能是值得考虑的,因为它消除了使用固定数组本身的所有好处。只需通过 php 本身检查有多少案例are covered(嗯,在 7.x 分支中)。
  • 我在 SplFixedArray 上实现了一次快速排序,以确定性能会受到什么影响。虽然我尽最大努力优化算法,但整个实验仅因 PHP 本身的开销而失败。
  • @Flosculus - 你愿意把代码贴在这里,还是粘贴到 pastebin 中?我真的很想看看你做了什么 - 看看你的表现结果。
  • @wally 我没有它了,但我可能会再写一次,因为我目前正在寻找使用SplFixedArray 创建Vector 的方法。仅供参考,我使用 Java 的快速排序算法来了解它是如何工作的:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…。然而,我花了很长时间才读完它......
【解决方案2】:

这是我使用 splFixedArrays 对冒泡排序的改编。在 PHP 7 中,这个简单程序的速度是常规冒泡排序的两倍

function bubbleSort(SplFixedArray $a) 
{
   $len = $a->getSize() - 1;
   $sorted = false;

   while (!$sorted) {
    $sorted = true;
    for ($i = 0; $i < $len; $i++)
    {
        $current = $a->offsetGet($i);
        $next = $a->offsetGet($i + 1);

        if ( $next < $current ) {
            $a->offsetSet($i, $next);
            $a->offsetSet($i + 1, $current);
            $sorted = false;
        }
    }
  }

  return $a
}

$starttime = microtime(true);
$array = SplFixedArray::fromArray([3,4,1,3,5,1,92,2,4124,424,52,12]);
$array = bubbleSort($array);

print_r($array->toArray());
echo (microtime(true) - $starttime) * 1000, PHP_EOL;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2011-11-09
    • 2014-04-18
    • 2016-05-17
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多