0

我正在做一个冒泡排序功能并遇到变量运算符问题。开头有一个switch块来决定是升序还是降序排序。$ 运算符旨在用于以下 if 条件。


<?php
//bubble sort in ascending/descending order
function bubbleSort($arr, $operation="ascending"){
    switch ($operation){
        case "ascending":
            $operator = ">";
            break;
        case "descending":
            $operator = "<";
            break;
    }
    //each loop put the largest number to the top
    for ($i=0; $i<count($arr)-1; $i++){

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

            //exchange the adjacent numbers that are arranged in undesired order
            if ($arr[$j]>$arr[$j+1]){
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}
$arr1 = array(1000,10,2,20,-1,-6,-8,0,101);
$arr1 = bubbleSort($arr1, "ascending");
print_r($arr1);
?>
4

1 回答 1

3

虽然从技术上讲,可以将运算符 (<>) 放在字符串中并从中编译出一个表达式(使用eval()),但大多数时候您既不需要也不想要这个。简单地分配一个布尔值来决定是否按升序排序,然后评估该布尔值是一种更常见的方法。

然后,您的代码归结为以下内容:

function bubbleSort($arr, $operation="ascending"){

    $ascending = ($operation == "ascending");

    //each loop put the largest number to the top
    for ($i=0; $i<count($arr)-1; $i++){

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

            //exchange the adjacent numbers that are arranged in undesired order
            if (($ascending && ($arr[$j] > $arr[$j+1])) 
            || (!$ascending && ($arr[$j] < $arr[$j+1])))

            {           
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}

当然,您可以跳过字符串评估并将$operation="ascending"参数更改为$ascending = true,省略函数中的第一行。

于 2012-07-03T09:45:45.017 回答