Сортировка элементов массива по номеру в строке? - PullRequest
1 голос
/ 08 ноября 2011

У меня есть файл .txt, который выглядит так:

john 1000 
mike 8393 
tom 1000 
bob 233 
roger 2 
daniel 233 
... ...

Мне нужно поместить каждую строку в массив и отсортировать по размеру числа, не теряя при этом, какое имя соответствует какому числу.

Также в файле повторяются некоторые цифры.

Наконец, я хочу отобразить элементы массива, отсортированные по размеру числа.

Ответы [ 3 ]

1 голос
/ 08 ноября 2011

Если вы используете 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 голос
/ 08 ноября 2011

Вы можете разбить каждую строку на массив целых чисел и строк (разбить ваши текущие строки на пробелы), а затем отсортировать массив, используя ksort (при условии, что ключ является целым числом), и вот вы!

Конечно, вы можете использовать более надежную сортировку, но это поможет вам.

Затем вы можете распечатать ее, используя print_r, чтобы напечатать читаемую человеком версию массива

http://php.net/manual/en/array.sorting.php

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

0 голосов
/ 08 ноября 2011

Вы можете пойти тремя путями:

1.Создать двумерный массив с числовыми индексами и отсортировать его с помощью usort ();и лямбда-функция

$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 ($ list);

для печати массива или созданияваш собственный код

PS Не забывайте, что вызов usort с использованием лямбда-функции - это способ PHP 5.3, если вы используете более раннюю версию PHP, вам следует использовать дискретную функцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...