2014-10-24 2 views
0

У меня есть переменная:Сортировать содержимое переменной в числовом порядке

$data = "Article 4 Article 2 Article 10"; 

Мне нужно, чтобы этот вывод:

Article 2 Article 4 Article 10 

Я пытался что-то вроде этого:

<?php 

$data = "Article 4 Article 2 Article 10"; 

function sort_titles_article_numbers($a,$b) { 
    $akey = $a->$data; 
    if (preg_match('/^Article (\d+)\. /', $akey, $matches)) { 
     $akey = $matches[1]; 
    } 
    $bkey = $b->$data; 
    if (preg_match('/^Article (\d+)\. /', $bkey, $matches)) { 
     $bkey = $matches[1]; 
    } 
    if ($akey == $bkey) { 
     return 0; 
    } 
    return ($akey < $bkey) ? -1 : 1; 
} 
uasort($data,'sort_titles_article_numbers'); 

echo $data; 

?> 

Но что-то неправильно. Кажется, что uasort работает только для массивов, но как я могу сортировать его внутри переменной?

+0

Почему вы не используете массив для хранения значений ? Использование одной строки для хранения нескольких строковых значений - это поиск проблем. – Christoffer

+0

Поверните строку в массив, отсортируйте ее, а затем верните ее в виде строки. –

+0

@ Крис да, вы правы, что сохранение в массиве - лучший способ, но у меня есть большая часть текстовых данных. и для меня интересно, есть ли другие способы. – kostya572

ответ

3
$data = "Article 4 Article 2 Article 10"; 

// line below splits string by number, keeping it, and trims elements of array 
$tmp = array_map('trim', preg_split('/\d+\K/', $data)); 

natsort($tmp); // very useful function for 'natural' sorting 

echo join(' ', $tmp); // converts array to string 

Результат - Article 2 Article 4 Article 10

+0

Благодарим вас за комментирование кода. – kostya572

0

Я нашел лучший способ сортировки массива численно, если вы хотите отдать приоритет только по номерам:

$data = "Artihcle 4 Artizcle 2 Article 10"; 

$tmp = preg_split('/\w \d+\K/', $data); 


usort($tmp, function ($a, $b) { 
    preg_match('/\d+$/', $a, $matchA); 
    preg_match('/\d+$/', $b, $matchB); 
    return $matchA[0] - $matchB[0]; 
}); 


$data2 = join(' ', $tmp); 

echo trim($data2); 
Смежные вопросы