按字符串中的数字对数组中的元素排序


Sorting Elements of an Array by number in string?

我有一个。txt文件,看起来像这样:

<>之前约翰1000年迈克8393汤姆1000年鲍勃233罗杰2233年丹尼尔……之前

我需要将每一行放入数组中,并按数字大小排序,而不丢失与数字对应的名称。

还有一些数字在文件中重复。

最后我想回显数组中按数字大小排序的元素

您可以将每行分成整数和字符串的数组(在空格上分割当前字符串),然后使用ksort对数组进行排序(假设键是整数),然后就可以了!

当然,您可以选择使用更健壮的排序,但这将使您达到目的。

然后可以使用print_r来打印数组

的人类可读版本。http://php.net/manual/en/array.sorting.php

http://php.net/manual/en/function.print-r.php

如果你运行的是php 5.3+

$fileLines = explode("'n", $fileContents);
usort($fileLines, function($a, $b) { 
  $aNumber = (int)substr($a, strpos($a, ' ')+1);
  $bNumber = (int)substr($b, strpos($b, ' ')+1);
  if($aNumber === $bNumber) {
    return 0;
  }
  return $aNumber > $bNumber ? 1 : -1;
}); 

如果你运行的是低版本,将函数转换为全局函数,并提供名称作为回调字符串。

usort($fileLines, 'sortlines'); 
function sortlines($a, $b) { 
  $aNumber = (int)substr($a, strpos($a, ' ')+1);
  $bNumber = (int)substr($b, strpos($b, ' ')+1);
  if($aNumber === $bNumber) {
    return 0;
  }
  return $aNumber > $bNumber ? 1 : -1;
}
然后

var_dump($fileLines);

你有三种选择:

1。创建带有数字索引的二维数组,并使用usort()对其排序;lambda函数

$list = array(array('name' => 'john', 'number' => 1000), 
    array('name' => 'mike', 'number' => 8393), 
    array('name' => 'tom', 'number' => 1000)
);
$by = 'number';
usort($list, function($first, $second) use ($by)
    {
        if ($first[$by] > $second[$by] { return 1; }
        elseif (first[$by] < $second[$by]) { return -1; }
        return 0;
    }
);

2。

创建以索引为名称的数组,并使用sort();
$list = array('john' => 1000, 
    'mike' => 8393,
    'tom' => 1000
);
sort($list);

3。创建索引为数字的数组,并使用ksort();

$list = array(1000 => 'john', 
    8393 => 'mike',
    1000 => 'tom'
);
ksort($list);

如果你选择第一种方式,你可以将元素命名为

$list[0][name] = 'bob'
$list[1][number] = 1000;

第二

$list['john'] = 1001;

第三
$list[1000] = 'bob';
在最后两种方法中,应该使用foreach遍历数组 使用

print_r($list);

或var_dump(列表)美元;

打印数组,或者创建自己的代码

注:不要忘记使用lambda函数调用ussort是PHP 5.3的方式,如果你使用的是早期版本的PHP,你应该使用离散函数