如果我有这个值的数组:
<?php
$aa=array(
"3456-898rterew",
"22-sdfsdf78",
"214-5548sdfsdf",
);
?>
我如何通过数字订购元素直到“ - ”,另一方面我需要指定第二个数字并显示从更高到更低的数字,然后将第二个数字放在“ - ”之后
我试试这个:
<?php
for ($i=0;$i<count($aa);$i++)
{
$arr[]="".$aa[$i]."";
}
arsort($arr);
foreach($arr as $ar)
{
print "".$ar." <br>";
}
?>
在这种情况下,我得到订单不好,我无法按此顺序得到我想要的结果:
3456-898rterew
214-5548sdfsdf
22-sdfsdf78
直到命令是正确的,需要以这种方式显示
从更高的数字到更低的数字,如果没有在“ - ”之后插入第二个数字,我得到但是创建的数字是以这种方式创建的。
答案 0 :(得分:0)
使用usort()
进行回调。将array_map()
与explode()
一起使用可创建包含这些数字的数组。然后,使用array_combine()
创建一个新数组,其中原始数组的值为键,数字数组为值:
代码:
usort($aa, function ($a, $b) use ($aa) {
$arr = array_combine(
array_values($aa), array_map(function($item) {
return explode('-', $item)[0];
}, $aa)
);
return $arr[$a] < $arr[$b];
});
print_r($aa);
输出:
Array
(
[0] => 3456-898rterew
[1] => 214-5548sdfsdf
[2] => 22-sdfsdf78
)
答案 1 :(得分:0)
PHP允许您为排序函数usort()
提供自己的比较函数,如果标准排序函数不合适,您可以使用此函数对数据进行排序。
首先,您的比较功能:
// printf calls are for illustration
function my_compare($a, $b) {
printf("comparing %s to %s: ", $a, $b);
// split
$a_parts = explode('-', $a);
$b_parts =explode('-', $b);
//cast
$a_int = intval($a_parts[0]);
$b_int = intval($b_parts[0]);
// compare
if( $a_int < $b_int ) {
printf("%s < %s \n", $a, $b);
return 1;
} else if( $a_int == $b_int ) {
printf("%s == %s \n", $a, $b);
return 0;
} else {
printf("%s > %s \n", $a, $b);
return -1;
}
}
然后只是usort($aa, 'my_compare');
。
输出:
comparing 22-sdfsdf78 to 3456-898rterew: 22-sdfsdf78 < 3456-898rterew
comparing 214-5548sdfsdf to 22-sdfsdf78: 214-5548sdfsdf > 22-sdfsdf78
comparing 3456-898rterew to 214-5548sdfsdf: 3456-898rterew > 214-5548sdfsdf
array (
0 => '3456-898rterew',
1 => '214-5548sdfsdf',
2 => '22-sdfsdf78',
)
答案 2 :(得分:0)
对于此任务,PHP http://php.net/usort是正确的方法。如果任何标准数组排序方法不适合您的任务,您可以定义自定义函数来对数组进行排序。
像这样$aa=array(
"3456-898rterew",
"22-sdfsdf78",
"214-5548sdfsdf"
);
usort($aa, function($a, $b){
// separate string
$a = explode('-', $a, 2);
$b = explode('-', $b, 2);
// select first part before -
$a = $a[0];
$b = $b[0];
// check if values are equal then do nothing
if ($a == $b) {
return 0;
}
// if $a bigger then $b - push array $a index lower then $b
return ($a > $b) ? -1 : 1;
});
print_R($aa);
输出
Array ( [0] => 3456-898rterew [1] => 214-5548sdfsdf [2] => 22-sdfsdf78 )
答案 3 :(得分:0)
对于PHP&gt; = 5.3:
usort($aa, function ($a, $b) {
$a = array_shift(explode('-', $a));
$b = array_shift(explode('-', $b));
return ($a < $b);
});
答案 4 :(得分:0)
以面向对象的方式,PHP将SplHeap对象与原生标准Php库(SPL)结合在一起。因此,您可以构建一个简单的迭代器来解决您的问题。
class YourSplHeap extends SplHeap {
public function compare( $value1, $value2 ) {
$number1 = explode("-", $value1);
$number2 = explode("-", $value2);
return ($number1[0] - $number2[0]);
}
}
$heap = new YourSplHeap();
$heap->insert("3456-898rterew");
$heap->insert("22-sdfsdf78");
$heap->insert("214-5548sdfsdf");
foreach ($heap as $entry) {
echo $entry . "<br />";
}
显示的obove类是SPL的SplMaxHeap对象的变体。它比较所有插入,用“ - ”拆分它们,比较整数值并对它们进行排序,使最大值保持在顶部。所以预期的结果如下:
3456-898rterew
214-5548sdfsdf
22-sdfsdf78