2015-04-09 2 views
0

Хорошо, я официально схожу с ума. Я пробовал все решения, найденные в Интернете, однако никто не работает.Сортировка 2D-массива PHP естественно

У меня есть этот массив:

$hits = array(
    array('sortby' => 'String 1', 'html' => '<div>This element contains String 1</div>', 
    array('sortby' => 'String 11', 'html' => '<div>This element contains String 11</div>', 
    array('sortby' => 'String 2', 'html' => '<div>This element contains String 2</div>', 
); 

Я хочу, чтобы отсортировать $ попадает массив естественно ключ «SortBy», поэтому выход становится так:

<div>This element contains String 1</div> 
<div>This element contains String 2</div> 
<div>This element contains String 11</div> 

Какая-то функция может Я использую?

+0

Возможно, вам придется написать свою собственную функцию. – Daan

ответ

3

Просто используйте usort() с strnatcmp() сравнения.

$hits = array(
    array('sortby' => 'String 1', 'html' => '<div>This element contains String 1</div>'), 
    array('sortby' => 'String 11', 'html' => '<div>This element contains String 11</div>'), 
    array('sortby' => 'String 2', 'html' => '<div>This element contains String 2</div>') 
); 

usort($hits, function($a, $b) { 
    return strnatcmp($a['sortby'], $b['sortby']); 
}); 

var_dump($hits); 

/* 
array(3) { 
    [0]=> 
    array(2) { 
    ["sortby"]=> 
    string(8) "String 1" 
    ["html"]=> 
    string(41) "<div>This element contains String 1</div>" 
    } 
    [1]=> 
    array(2) { 
    ["sortby"]=> 
    string(8) "String 2" 
    ["html"]=> 
    string(41) "<div>This element contains String 2</div>" 
    } 
    [2]=> 
    array(2) { 
    ["sortby"]=> 
    string(9) "String 11" 
    ["html"]=> 
    string(42) "<div>This element contains String 11</div>" 
    } 
} 
*/ 
1
usort($hits, function($a, $b){ 
    return strnatcmp($a['sortby'], $b['sortby']); 
}); 
+1

, поскольку он хотел, чтобы он отсортировался естественным образом: function ($ a, $ b) {return strnatcmp ($ a ['sortby'], $ b ['sortby']); } –

+0

Это определенно ** не ** естественно отсортировано: '11, 2, 473, 5' вместо' 2, 5, 11, 473' – zessx

+0

@JensSchulze Я пропустил «естественно» часть спасибо за исправление – Peter

0

Попробуйте ниже:

<?php 
$hits = array(
    array('sortby' => 'String 1', 'html' => '<div>This element contains String 1</div>'), 
    array('sortby' => 'String 11', 'html' => '<div>This element contains String 11</div>'), 
    array('sortby' => 'String 2', 'html' => '<div>This element contains String 2</div>') 
); 

function comp($a, $b) { 
    $n1 = intval(substr($a['sortby'], 7)); 
    $n2 = intval(substr($b['sortby'], 7)); 
    return $n1>$n2; 
} 

usort($hits, "comp"); 

print_r($hits); 

?> 

Использование usort(), вы можете применить правило сортировки.