我有一个大学的任务,不管你信不信,这只是没有意义,我一直试图找到一个解决方案来完成最近几天的任务,但却无法提出任何建议。任务是要求我们为二维数组创建一个自定义排序函数,我们不允许像内置函数一样使用asort或ksort,我们必须创建类似于这些内置排序函数的自己的函数。
这是数组:
$employee_salary = array(
"Emre Ozpalamutcu" => "9500",
"Chuck Norris" => "3100",
"Tony Stark" => "8700",
"Jordan Belfort" => "7800",
"Katniss Everdeen" => "5900"
);
我需要2个不同的函数,第一个函数将值按升序排序,第二个函数将按键排序为a到z的顺序。
非常感谢!!!
答案 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);
这是我得到的:
答案 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 强>
这很简单,因为您的值仅包含数字。我们所做的是,只在新数组中使用您的值(带索引号)并对它们进行排序。这里的排序是冒泡排序,因为我们正在检查每个组合并在它们排序错误时交换它们。一旦所有值按正确的顺序排序,我们使用名为array_custom_search
的自定义函数,它返回原始数组中每个值的键。
这需要更多的工作,因为你的元素是由字符组成的。我们需要知道每个字母的顺序,以确定应该首先放置哪个。为此,我们使用函数ord
,它返回字符的ASCII值。 Here's ASCII字符列表,您可以看到下一个字母的十进制值递增,ord
只返回。然后,一旦使用冒泡排序按键以正确的字母顺序对键进行排序,我们将使用名为array_custom_search_value
的自定义函数返回每个键的值来自原始阵列。
PS:我添加了Tony Starj
元素,以显示在排序之前它将如何检查整个文本。