在此函数代码末尾返回 -1 而不是 0 的原因是什么?
What is the reason of returning -1 instead of lets say 0 at the end of this function's code?
我说的是第二个“return -1;”在代码的第 12 行。仅当两组数字完全相同时才会达到此目的,例如将“192.167.11”与“192.167.11”进行比较时。我还要补充一点,使用 range(0,2) 将是这段代码的更好选择(如果两个元素恰好相同,range(0,3) 会产生错误;我没有更改它,因为这是原始代码来自 PHP 的代码示例来自 w3resource.com) 的数组练习 #21).
<?php
function sort_subnets($x, $y){
$x_arr = explode('.', $x);
$y_arr = explode('.', $y);
foreach (range(0, 3) as $i) {
if ($x_arr[$i] < $y_arr[$i]) {
return -1;
} elseif ($x_arr[$i] > $y_arr[$i]) {
return 1;
}
}
return -1;
}
$subnet_list =
array('192.169.12',
'192.167.11',
'192.169.14',
'192.168.13',
'192.167.12',
'122.169.15',
'192.167.16'
);
usort($subnet_list, 'sort_subnets');
print_r($subnet_list);
?>
返回“-1”会将第二个元素(与当前 $x 和 $y 对中的第一个元素相同)移向数组的较高索引(向下数组)。如果两个元素完全相同,为什么不 return "0" 并保持一切不变?是否有任何理由 returning "-1" 可能基于 usort() 的工作方式(或任何其他因素)?
谢谢。
编辑:
我认为这是插入排序(数组大小为 6-15 个元素;通常是快速排序)。
如果两个元素相同,则交换顺序和保持顺序相同没有区别。所以在那种情况下 returns 没有什么区别。
你是对的 0
更合适。如果 usort
是 "stable",这将更加重要。但是 documentation 说
Note:
If two members compare as equal, their relative order in the sorted array is undefined.
为了说明@Don'tPanic 的优点:
<?php
function sort_subnets($x, $y){
$x_arr = explode('.', $x);
$y_arr = explode('.', $y);
return $x_arr <=> $y_arr;
}
$subnet_list =
array('192.169.12',
'192.167.11',
'192.169.14',
'192.168.13',
'192.167.12',
'122.169.15',
'192.167.16'
);
usort($subnet_list, 'sort_subnets');
print_r($subnet_list);
注意 "spaceship" 运算符的使用,即 <=>
,它提供了一种简洁性,使人不必在函数中编写如下代码:
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
最后,请注意 usort() 的用户定义回调利用 ternary logic because sometimes as in the case of sorting bivalent logic is insufficient. Yet, usort() 本身利用两部分逻辑,成功时返回 TRUE,失败时返回 FALSE。
我说的是第二个“return -1;”在代码的第 12 行。仅当两组数字完全相同时才会达到此目的,例如将“192.167.11”与“192.167.11”进行比较时。我还要补充一点,使用 range(0,2) 将是这段代码的更好选择(如果两个元素恰好相同,range(0,3) 会产生错误;我没有更改它,因为这是原始代码来自 PHP 的代码示例来自 w3resource.com) 的数组练习 #21).
<?php
function sort_subnets($x, $y){
$x_arr = explode('.', $x);
$y_arr = explode('.', $y);
foreach (range(0, 3) as $i) {
if ($x_arr[$i] < $y_arr[$i]) {
return -1;
} elseif ($x_arr[$i] > $y_arr[$i]) {
return 1;
}
}
return -1;
}
$subnet_list =
array('192.169.12',
'192.167.11',
'192.169.14',
'192.168.13',
'192.167.12',
'122.169.15',
'192.167.16'
);
usort($subnet_list, 'sort_subnets');
print_r($subnet_list);
?>
返回“-1”会将第二个元素(与当前 $x 和 $y 对中的第一个元素相同)移向数组的较高索引(向下数组)。如果两个元素完全相同,为什么不 return "0" 并保持一切不变?是否有任何理由 returning "-1" 可能基于 usort() 的工作方式(或任何其他因素)?
谢谢。
编辑:
我认为这是插入排序(数组大小为 6-15 个元素;通常是快速排序)。
如果两个元素相同,则交换顺序和保持顺序相同没有区别。所以在那种情况下 returns 没有什么区别。
你是对的 0
更合适。如果 usort
是 "stable",这将更加重要。但是 documentation 说
Note:
If two members compare as equal, their relative order in the sorted array is undefined.
为了说明@Don'tPanic 的优点:
<?php
function sort_subnets($x, $y){
$x_arr = explode('.', $x);
$y_arr = explode('.', $y);
return $x_arr <=> $y_arr;
}
$subnet_list =
array('192.169.12',
'192.167.11',
'192.169.14',
'192.168.13',
'192.167.12',
'122.169.15',
'192.167.16'
);
usort($subnet_list, 'sort_subnets');
print_r($subnet_list);
注意 "spaceship" 运算符的使用,即 <=>
,它提供了一种简洁性,使人不必在函数中编写如下代码:
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
最后,请注意 usort() 的用户定义回调利用 ternary logic because sometimes as in the case of sorting bivalent logic is insufficient. Yet, usort() 本身利用两部分逻辑,成功时返回 TRUE,失败时返回 FALSE。