3
<?php
function sortArray() {
    $inputArray = array(8, 2, 7, 4, 5);
    $outArray = array();
    for($x=1; $x<=100; $x++) {
        if (in_array($x, $inputArray)) {
            array_push($outArray, $x);
        }
    }
    return $outArray;
}


$sortArray = sortArray();
foreach ($sortArray as $value) {
    echo $value . "<br />";
}
?>

我有这段代码,但有两个问题

  • 如果我的数组中的数字大于 100 怎么办?
  • 另外,我希望看到不止一种排序方法
4

21 回答 21

28

这是排序的方法。

<?php

$array=array('2','4','8','5','1','7','6','9','10','3');

echo "Unsorted array is: ";
echo "<br />";
print_r($array);


for($j = 0; $j < count($array); $j ++) {
    for($i = 0; $i < count($array)-1; $i ++){

        if($array[$i] > $array[$i+1]) {
            $temp = $array[$i+1];
            $array[$i+1]=$array[$i];
            $array[$i]=$temp;
        }       
    }
}

echo "Sorted Array is: ";
echo "<br />";
print_r($array);

?>
于 2013-03-07T19:23:13.517 回答
4

这里所有接受的答案都很好,其中大多数使用两个 for 循环对数组进行排序。起初,代码看起来相当直接,甚至我也这么认为。但后来我想进一步调查。这种方法效率如何?因此,为了保持一致性,我创建了一个包含 10,000 个“计数”或值的数组,并将其写入一个文件以供稍后包含,使用以下代码:

$str = "<?php \n \$array = array( \n";
for($x = 0; $x <= 10000; $x++){
    $str .= mt_rand(0,10000).",\n";
}
$str .= "); \n ?>";

$file = fopen('req_arr.php', 'w+');
echo fwrite($file,$str);
fclose($file);

include_once('req_arr.php');

$arr = $array;

然后我使用了这里大多数人给出的两个 for 循环方法,并测量了所花费的时间:

    $start = microtime(1);
    $cnt = count($arr);
    for($i = 0; $i < $cnt; $i++ ){
        for($j = 0; $j < $cnt-1; $j++ ){
            $temp = '';
            if($arra[$j] > $arra[$j+1]){
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    $stop = microtime(1);
    echo $stop - $start;
    echo '<pre>'; print_r($arr);

这使执行时间(以秒为单位)为7.5408220291138

注意:此代码在 Windows10、64 位、i7 gen 4、8 GB RAM 和 Chrome 上的 XAMPP 中进行了测试。

这太过分了。我敢肯定PHP不能这么草率。所以接下来我使用以下代码测试了内置的 PHP rsort() 函数:

$start = microtime(1);
rsort($arr, SORT_NUMERIC);
$stop = microtime(1);
echo $stop - $start;
echo '<pre>'; print_r($arr);    

这一次,执行时间仅为0.0033688545227051秒。只需 0.0033688545227051 秒即可对 10,000 个值的数组进行排序。显然,这两个 for 循环方法对于 PHP 在其核心中使用的任何东西都是低效的。

对 Google/PHP.net 的快速研究给了我答案,即 PHP 使用快速排序算法对索引数组进行排序,并且它不使用两个 for 循环而是递归函数。我深入挖掘并找到了一些 C++、Java 等的快速搜索示例。因此,我在 PHP 中复制了它们,如下所示:

/*
    The main function that implements QuickSort
    arr --> Array to be sorted,
    low  --> Starting index,
    high  --> Ending index
*/
function quickSort(&$arr, $low, $high)
{
    if ($low < $high)
    {
        /* pi is partitioning index, arr[p] is now
           at right place */
        $pi = partition($arr, $low, $high);
        // Separately sort elements before
        // partition and after partition
        quickSort($arr, $low, $pi - 1);
        quickSort($arr, $pi + 1, $high);
    }

    return $arr;
}

function partition (&$arr, $low = 0, $high)
{
    $pivot = $arr[$high];  // pivot
    $i = ($low - 1);  // Index of smaller element

    for ($j = $low; $j <= $high-1; $j++)
    {
        // If current element is smaller than or
        // equal to pivot
        if ($arr[$j] <= $pivot)
        {
            $i++;    // increment index of smaller element
            swap($arr[$i], $arr[$j]);
        }
    }
    swap($arr[$i + 1], $arr[$high]);
    return ($i + 1);
}

function swap(&$a, &$b){
    $t = $a;
    $a = $b;
    $b = $t;
}

显然,这可以进一步优化,但我只是想让一些东西运行并查看结果,这就足够了。那么,现在让我们看看结果:

$start = microtime(1);
$sarr = quickSort($array, 0, $cnt-1);
$stop = microtime(1);
echo $stop - $start;
echo '<pre>';print_r($sarr);
die();

该算法所花费的时间为:0.022707939147949

仍然,不如 rsort() 快但令人满意。我也用一百万个值数组尝试了同样的方法,但是两个 for 循环数组刚刚耗尽了内存,我决定即使是 10,000 个值数组也很好地证明了这个理论。

欢呼...

于 2018-07-16T00:31:57.823 回答
2
    $arr= array(110,20,130,100,2);

    for($i=0; $i<count($arr)-1; $i++)
    {
        for($j=0; $j<count($arr)-1; $j++)
        {
            if($arr[$j]> $arr[$j+1]){
                $temp= $arr[$j+1];
                $arr[$j+1]= $arr[$j];
                $arr[$j]= $temp;
            }
        }

    }
    print_r($arr);
于 2015-09-13T13:09:23.903 回答
1
//Here is the simplest way of sorting...
$list = array('5','15','7','12','39','1','5');
$a;
$b;
for($i=0;$i<count($list);$i++){ 
    for($j=0;$j<count($list);$j++){
        if($list[$i] < $list[$j]){
            $a = $list[$j]; 
            $b = $list[$i];     

            $list[$i] = $a;
            $list[$j] = $b;
        }
    }
}
于 2019-10-15T15:00:39.153 回答
1

排序和数组不使用内置方法,但所有答案都使用预定义方法count

我只是想折射它。请找到以下答案。

$array = [50,12, 30, 10, 9, 14];
$count = 0;
foreach($array as $elem){
    $count++;
}
for ($i = 0; $i < $count; $i++) {
    for ($j = 0; $j < $count - 1; $j++) {
        if ($array[$j] > $array[$j + 1]) { 
            $temp = $array[$j];
            $array[$j] = $array[$j + 1]; 
            $array[$j +1] = $temp; 
        }
    }
}
print_r($array); 
于 2020-12-23T09:49:26.370 回答
0

这是最简单的排序方法...

function sort($arr) {
  for ($i=0; $i<count($arr); $i++) {
    for ($j=0; $j<count($arr)-1-$i; $j++) {
        if ($arr[$j+1] < $arr[$j]) {
            swap($arr, $j, $j+1);
        }
     }
  }
  return $arr;
}

function swap(&$arr, $a, $b) {
   $tmp = $arr[$a];
   $arr[$a] = $arr[$b];
   $arr[$b] = $tmp;
}

//using sorting functions
$arr = array(1,13,2,9,5,7,0,3);

 echo("Before sorting");
 print_r($arr);

 sort($arr);

 echo("Sorted array");
 print_r($arr);
于 2012-09-13T15:00:39.477 回答
0

看看这个,这个效率更高

$array=array('2','4','8','5','1','7','6','9','10','3');


for($i=1;$i< count($array);$i++)
{
   for($j=$i;$j>0;$j--)
   {    
       if($array[$j] < $array[$j-1])
       { 
           $tmp = $array[$j];
           $array[$j] = $array[$j-1];
           $array[$j-1] = $tmp ;
       }
   }
}

echo "<pre>";
print_r($array);
于 2015-02-13T03:40:30.630 回答
0

这是php中的正确解决方案:

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

for($i=1;$i< count($array);$i++)
{
   for($j=$i;$j>0;$j--)
   {    
       if($array[$j] < $array[$j-1])
       { 
           $tmp = $array[$j];
           $array[$j] = $array[$j-1];
           $array[$j-1] = $tmp ;
       }
   }
}
于 2015-08-28T16:01:29.373 回答
0

我们可以使用冒泡排序进行排序。

O(n) 的最佳情况下的性能。否则,最好情况 == 最坏情况 == 平均情况 == O(n^2)

$Obj1 = array(20, 30, 10, 50, 40, 60, 100, 90, 80, 70);

 $temp;

print_r($Obj1);


for ($i = 0; $i < sizeof($Obj1) - 1; $i++) {

for ($j = sizeof($Obj1) - 1; $j > $i; $j--) {
    if ($Obj1[$j - 1] > $Obj1[$j]) {
        $temp = $Obj1[$j-1];
        $Obj1[$j-1] = $Obj1[$j];
        $Obj1[$j] = $temp;
        $temp = 0;
    }
}

}

print_r($Obj1);
于 2015-11-06T06:19:36.523 回答
0

你可以参考这个程序。

<?php

//using sorting functions
$arr = array(1,13,2,9,5,7,0,3);

echo("Before sorting");
echo "<pre>";
print_r($arr);
echo "</pre>";

for ($i=0; $i < count($arr)-1; $i++) {
	sortarray($arr);
}

function sortarray(&$arr) {
    for ($i=0; $i < count($arr)-1; $i++) {
        if ($arr[$i+1] < $arr[$i]) {
            $tmp = $arr[$i+1];
            $arr[$i+1] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
}

echo("Sorted array");
echo "<pre>";
print_r($arr);
echo "</pre>";
?>

于 2016-06-18T15:13:28.707 回答
0
    **Using Bubbole Sort:**
<?php
        $arr =array(12,10,190,90,890);
        echo "Before Sorting Array";echo '</br>';
        print_r($arr);echo '</br>';
        echo 'After Sorting Arry:'.'</br>';
        for ($i = 0; $i < sizeof($arr); $i++) {
            for ($j = $i + 1; $j < sizeof($arr); $j++) {
                $tmp = 0;
                if ($arr[$i] > $arr[$j]) {
                    $tmp = $arr[$i];
                    $arr[$i] = $arr[$j];
                    $arr[$j] = $tmp;
                }
            }
            echo $arr[$i];echo '</br>';
        }
    ?>
于 2016-08-25T07:52:33.913 回答
0

检查这个,初学者的基本逻辑step by step

<?php 

         $array = array('5','15','7','12','39','1','5');

         echo "Before Sort ";
         echo "<pre>";
         print_r($array);

         echo "<BR/>After Sort ";
         for($prnt_index=0; $prnt_index < count($array); $prnt_index++){


            // echo $array[$prnt_index].", ";

            for($child_index=0; $child_index < count($array)-1 ; $child_index++){

                if($array[$child_index] > $array[$child_index+1] ){     // 9, 7

                    //apply swapping concept
                    $temp_var= $array[$child_index+1];  //put 7 in some temp var 

                    //  swap current index with next index
                    $array[$child_index+1] =$array[$child_index];

                    // get temp data and put on current index 

                    $array[$child_index] =$temp_var; 
                }

            }   
         }


         print_r($array);
         echo "</pre>";

        ?>

输出 在此处输入图像描述

于 2017-09-15T06:32:37.287 回答
0
<?php
$array = array(5,3,1,6,7,4,8,2);
for($i=0; $i < count($array); $i++)
{
  for($j=0; $j < $i; $j++)
  {
    if($array[$i] < $array[$j])
    {
        $temp = $array[$i];
        $array[$i] = $array[$j];
        $array[$j] = $temp;
    }
  }
}
print_r($array);
?>
于 2017-11-27T09:59:06.463 回答
0
<?php
$array  = array(1,4,10,5,8,3,6,61,0);

for($x=0;$x<=count($array)-1;$x++){

    for($z=0;$z<=count($array)-1;$z++){

    if($array[$x]<$array[$z])
    {
        $temp = $array[$x];
        $array[$x] = $array[$z];
        $array[$z] = $temp;
    }

    }   
}

print_r($array);
于 2018-04-03T12:01:21.493 回答
0
//Best solution for bubble sort
$a = [10,5,2,8,7];
$k = 0;//I used this variable because i want to show you how many times my for loop needs to iterate maximum.
for($i = 0;$i < count($a); $i++){
    for($j = 1; $j < count($a) - $i; $j++){
        if($a[$j -1 ] > $a[$j]){
            $temp = $a[$j];
            $a[$j] = $a[$j -1];
            $a[$j - 1] = $temp;
        }
        $k++;
    }

}
echo $k;
echo '<pre>';
print_r($a);
echo '</pre>';
于 2018-09-21T21:02:33.563 回答
0

这是我在 PHP 中的快速排序算法:

<?php
$array = [1, 4, 3, 5, 9, 6, 1, 6, 4, 1, 1, 4, 5, 6, 6, 7, 2, 1, 4, 0];
$j = count($array);
$t = $j-1;
while($j>=0){
    for ($i=0; $i < $t; $i++) { 
        $aux = $array[$i]; 
        if($array[$i]>$array[$i+1]){
            $array[$i] = $array[$i+1];
            $array[$i+1] = $aux;
        }
    }
    $j--;
}
print_r($array);
于 2019-06-16T04:43:46.763 回答
0
$q = [1,3,6,2,8,9,4];  //let's say any array

for($i = 0; $i<=count($q)-1;$i++){
  for($j =0; $j<count($q)-1;$j++){
     if($q[$j] < $q[$j+1]){         //for ASC or DESC just switch '>' or '<'
          $var = $q[$j+1];
          $q[$j+1] = $q[$j];
          $q[$j]=$var;              
     }
   }
}
print_r($q);  //This is sorted array'
于 2019-10-15T08:55:15.557 回答
0
$arr = array(8, 2, 7, 4, 5);

for($j=0; $j <= count($arr)-1; $j++){
  for($i=0; $i <= count($arr)-1; $i++){

      if( $arr[$i] < $arr[$j]){  //'<' or '>' operator for Asc, Dec.
         $temp = $arr[$i];
         $arr[$i] = $arr[$j];
         $arr[$j] = $temp;
      }
}
echo'<pre>';
print_r($arr);
于 2020-04-07T07:03:29.680 回答
-1
$array = array('1','2','4','3','8','7','10','11');

$c = count($array);
for($i=0;$i<$c;$i++)
{
    if($array[$i] > $array[$i+1]) {
            $temp = $array[$i+1];
            $array[$i+1]=$array[$i];
            $array[$i]=$temp;
        }  
}

echo "Sorted Array is: ";
echo "<br /><pre>";
print_r($array);
于 2015-08-21T06:51:26.780 回答
-1

这是最好的排序方式。还要检查响应时间。

 function findMaxVal($arr)
 {
  $maxNum = $arr[0];

  foreach($arr as $arval)
  {
   $maxNum = $maxNum < $arval ? $arval : $maxNum;
  }

  return $maxNum;
 }

 function sortArrFun($arr)
 {
  $maxVal = findMaxVal($arr);
  $countArr = array();

  for($i = 0; $i <= $maxVal; $i++)
  {
   $countArr[$i] = 0;
  } 

  for($i = 0; $i < count($arr); $i++)
  {
   $countArr[$arr[$i]]++;
  }

  $order = array();
  for($i = 0; $i < count($countArr); $i++)
  {
   for($j = 0; $j < $countArr[$i]; $j++)
   {
    $order[] = $i;
   }
  }

  return $order;
 }

 $arrr = [1,22,333,45,5,8888,9999,0,9,7,8]
 print_r(sortArrFun($arrr1));
于 2019-12-22T08:49:09.897 回答
-1

排序数组值而不使用内置的 php,如 sort() 等 显示演示 仅适用于 php7.2.0 - 7.4.4

<?php
$str = [54,23,2,56,7,2,300];
$count = count($str);
for ($j = 0; $j < $count; $j++) {
for ($i = $j + 1; $i < $count; $i++) {
    if ($str[$i] < $str[$j]) {
        list($str[$i], $str[$j]) = [$str[$j], $str[$i]];
    }
}
}
print_r($str);
?>
于 2020-04-07T19:00:23.123 回答