Php order elements由一部分值组成

时间:2013-12-16 20:50:49

标签: php sorting

如果我有这个值的数组:

<?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

直到命令是正确的,需要以这种方式显示

从更高的数字到更低的数字,如果没有在“ - ”之后插入第二个数字,我得到但是创建的数字是以这种方式创建的。

5 个答案:

答案 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