2016-05-20 2 views
0

У меня есть ниже массивамассива в ниже шаблоне

Array 
(
    [0] => Array 
     (
      [ft_name] => workout 
      [days] => 2 
     ) 

    [1] => Array 
     (
      [ft_name] => restday 
      [days] => 
     ) 

    [2] => Array 
     (
      [ft_name] => df 
      [days] => 3 
     ) 

    [3] => Array 
     (
      [ft_name] => df 
      [days] => 1 
     ) 

    [4] => Array 
     (
      [ft_name] => restday 
      [days] => 
     ) 

    [5] => Array 
     (
      [ft_name] => ss 
      [days] => 6 
     ) 

    [6] => Array 
     (
      [ft_name] => reday 
      [days] => 5 
     ) 

) 

Я хочу это в таком формате, как позиции массива, имеющий ft_name=>"restday" должен оставаться таким же, а остальные должны быть отсортирован в порядке days поля

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

<?php  
$size = count($val); 
    for($i=0;$i< $size;$i++){ 
     if($val[$i]['days']){ 
      for ($j=0; $j<$size-$i; $j++) { 

       if(!$val[$j+1]['days']) continue; 

       if ($val[$j+1]['days'] < $val[$j]['days']) { 
         swap($val, $j, $j+1); 
       } 
      } 
     } 
     else{ 
      continue; 
     } 

    } 
    echo "<pre>"; print_r($val); 

    function swap(&$arr, $a, $b) { 
     $tmp = $arr[$a]; 
     $arr[$a] = $arr[$b]; 
     $arr[$b] = $tmp; 
    } 
?> 

Вывод должен быть похож на это один

Array 
(
    [0] => Array 
     (
      [ft_name] => df 
      [days] => 1 
     ) 

    [1] => Array 
     (
      [ft_name] => restday 
      [days] => 
     ) 

    [2] => Array 
     (
      [ft_name] => workout 
      [days] => 2 
     ) 

    [3] => Array 
     (
      [ft_name] => df 
      [days] => 4 
     )   

    [4] => Array 
     (
      [ft_name] => restday 
      [days] => 
     ) 

    [5] => Array 
     (
      [ft_name] => reday 
      [days] => 5 
     ) 

    [6] => Array 
     (
      [ft_name] => ss 
      [days] => 6 
     ) 

) 

Спасибо заранее.

+2

Это не код для бесплатного обслуживания, как вы бы знали, так что вы пробовали? – Darren

+0

Вы пробовали 'array_multisort'? – David

+1

try 'array_multisort' –

ответ

3

Вы должны попробовать array_multisort, здесь у вас есть documentation

<?php 
// Obtain a list of columns 
foreach ($data as $key => $row) { 
    if ($row['days'] != ''){ 
     $days[$key] = $row['days']; 
     $name[$key] = $row['ft_name']; 
    }else{ 
     $days[$key] = $key; 
     $name[$key] = $row['ft_name']; 
     } 
    } 

// Sort the data with volume descending, edition ascending 
// Add $data as the last parameter, to sort by the common key 
array_multisort($days, SORT_ASC, $name, SORT_ASC, $data); 
?> 

Here у вас есть хороший пост о PHP Сортировка массивов

+0

Спасибо, я уже пробовал этот код, но также менял положение в день отдыха, и я хочу сохранить положение покоя как то же самое. –

+0

вы можете попробовать добавить условие if внутри foreach, я обновлю ответ – David

1

Используйте usort() с функцией обратного вызова, имеющей 2 теста один основного поля и, если основное поле имеет одинаковую величину, проверить второе поле

Вы можете снизить число меня, я неправильно понял

Смежные вопросы