如何使用PHP中的自定义函数对2D数组进行排序?

时间:2014-03-19 12:26:08

标签: php html arrays sorting multidimensional-array

我有一个大学的任务,不管你信不信,这只是没有意义,我一直试图找到一个解决方案来完成最近几天的任务,但却无法提出任何建议。任务是要求我们为二维数组创建一个自定义排序函数,我们不允许像内置函数一样使用asort或ksort,我们必须创建类似于这些内置排序函数的自己的函数。

这是数组:

$employee_salary = array(
    "Emre Ozpalamutcu"  => "9500",
    "Chuck Norris" => "3100",
    "Tony Stark" => "8700",
    "Jordan Belfort" => "7800",
    "Katniss Everdeen" => "5900"
);

我需要2个不同的函数,第一个函数将值按升序排序,第二个函数将按键排序为a到z的顺序。

非常感谢!!!

3 个答案:

答案 0 :(得分:0)

为什么不使用冒泡排序或快速排序算法?这就是这些内置函数在幕后使用的内容。

写下你自己的实现,www上有很多有用的资源!

答案 1 :(得分:0)

试试这个,前提是你当然可以使用array_ *函数:

$unsorted = array(
"Emre Ozpalamutcu"  => "9500",
"Chuck Norris" => "3100",
"Tony Stark" => "8700",
"Jordan Belfort" => "7800",
"Katniss Everdeen" => "5900"
);

function arraySort(Array $array, $byKey = true) {

    if ($byKey) {
        $targetArray = array_keys($array);
    } else {
        $targetArray = array_values($array);
        $array = array_flip($array);
    }

    $keys = quick_sort($targetArray);

    foreach ($keys as $key) {
        $tmp[$key] = $array[$key];
    }

    return $tmp;
}

function quick_sort($array)
{
    if(count($array) <= 1){
        return $array;
    }
    else{

        $pivot = $array[0];
        $left = $right = array();

        for($i = 1; $i < count($array); $i++)
        {
            if($array[$i] < $pivot){
                $left[] = $array[$i];
            }
            else{
                $right[] = $array[$i];
            }
        }
        return array_merge(quick_sort($left), array($pivot), quick_sort($right));
    }
}
$sorted = arraySort($unsorted);
print_r($sorted);
$sorted = arraySort($unsorted, false);
print_r($sorted);

这是我得到的:

Output

答案 2 :(得分:0)

我同意关于努力部分的评论,但是,我想测试这个,所以这里是我的答案,不使用任何排序或数组函数(我只使用ord来查找ASCII值字符):

$employee_salary = array(

    "Tony Starj" => "8700",
    "Emre Ozpalamutcu"  => "9500",
    "Chuck Norris" => "3100",
    "Tony Stark" => "8700",
    "Jordan Belfort" => "7800",
    "Katniss Everdeen" => "5900"
);

function sort_values($array){
    $length = count($array);
    if (!$length) {
        return $array;
    }

    foreach($array as $k=>$v){
        $new[] = $v;
    }

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

    function array_custom_search($arr, $search)
    {
        foreach ($arr as $key => $v){
            if ($v==$search){
                return $key;
            }
        }

        return false;
    }

    $new2 = array();
    foreach($new as $k=>$v){
        $key = array_custom_search($array,$v);
        $new2[$key] = $v;
    }

    return $new2;

}


function sort_key($array){
    $length = count($array);
    if (!$length) {
        return $array;
    }

    foreach($array as $k=>$v){
        $new[] = $k;
    }


    function recursive_nextelement($str1, $str2, $counter){
        $counter++;
        if(ord($str1[$counter])==ord($str2[$counter])){
            return recursive_nextelement($str1, $str2, $counter);
        }
        elseif(ord($str1[$counter]) > ord($str2[$counter])){
            return 1;
        }
        elseif(ord($str1[$counter]) < ord($str2[$counter])){
            return 0;
        }


    }
    for($i=0; $i<$length-1; $i++){
        for($j=0; $j<$length-1; $j++){
            if(ord($new[$j][0]) > ord($new[$j+1][0])){
                $temp = $new[$j];
                $new[$j] = $new[$j+1];
                $new[$j+1] = $temp;
            }
            elseif(ord($new[$j][0]) == ord($new[$j+1][0])){
                $return = recursive_nextelement($new[$j],$new[$j+1],0);
                if($return===1){
                    $temp = $new[$j];
                    $new[$j] = $new[$j+1];
                    $new[$j+1] = $temp;
                }
            }
        }
    }

    function array_custom_search_value($arr, $search)
    {
        foreach ($arr as $key => $v){
            if ($key==$search){
                return $v;
            }
        }

        return false;
    }

    $new2 = array();
    foreach($new as $k=>$v){
        $value = array_custom_search_value($array,$v);
        $new2[$v] = $value;
    }

    return $new2;

}

<强> Demo

说明:

1)按值排序:

这很简单,因为您的值仅包含数字。我们所做的是,只在新数组中使用您的值(带索引号)并对它们进行排序。这里的排序是冒泡排序,因为我们正在检查每个组合并在它们排序错误时交换它们。一旦所有值按正确的顺序排序,我们使用名为array_custom_search的自定义函数,它返回原始数组中每个值键。

2)按键排序:

这需要更多的工作,因为你的元素是由字符组成的。我们需要知道每个字母的顺序,以确定应该首先放置哪个。为此,我们使用函数ord,它返回字符的ASCII值。 Here's ASCII字符列表,您可以看到下一个字母的十进制值递增,ord只返回。然后,一旦使用冒泡排序按键以正确的字母顺序对键进行排序,我们将使用名为array_custom_search_value的自定义函数返回每个键的来自原始阵列。

PS:我添加了Tony Starj元素,以显示在排序之前它将如何检查整个文本。