0

バブルソート関数を実行していますが、変数演算子の問題が発生します。最初に、昇順または降順のどちらでソートするかを決定するためのスイッチブロックがあります。$ operatorは、次の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 に答える