如何对SplFixedArray进行排序?

时间:2013-07-21 14:54:10

标签: php arrays sorting spl

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

2 个答案:

答案 0 :(得分:3)

首先,祝贺找到并使用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这样的东西存在并且迫使你自己去理解&#34;快速调用array_sort()&#34; (以及为什么它需要很长时间才能运行)使程序员和程序员之间产生差异。我赞赏你的问题!

答案 1 :(得分:2)

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

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;