2013-10-04 4 views
0

У меня есть данные о сотрудниках, хранящиеся в многомерном массиве. Теперь я хочу сортировать данные через функцию array_multisort(), но я хочу получить другой результат путем сортировки. Я хочу сортировать в соответствии с именем или датой или числовыми значениями. Ниже код, в котором есть многомерный массив:Как отсортировать многомерный массив с помощью array_multisort() для определенного ключа?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>ABC Company</title> 
<style> 
a 
{ 
    text-decoration:none; color:#000; 
} 
</style> 
</head> 

<body> 
    <div style="width:900px; height:500px; margin:auto; border:1px solid; text-align:center;"> 
     <h1><strong>ABC-Company</strong></h1> 
     <h2>Employees:</h2> 
     <table width="100%" border="7"> 
      <tr style="font-size:20px; font-weight:bold;"> 
       <td> 
       <a href="#">Name</a> 
       </td> 
       <td> 
       <a href="#">Gender</a> 
       </td> 
       <td> 
       <a href="#">DOB</a> 
       </td> 
       <td> 
       <a href="#">Position</a> 
       </td> 
       <td> 
       <a href="#">Start Date</a> 
       </td> 
       <td> 
       <a href="#">Gross Salary</a> 
       </td> 
       <td> 
       <a href="#">Tax</a> 
       </td> 
       <td> 
       <a href="#">Pension</a> 
       </td> 
       <td> 
       <a href="#">Net Salary</a> 
       </td> 
      </tr> 
      <?php 
      /*****GROSS SALARY***** 
      Creates an array containing the gross salary data for all the employees*/ 
      $salaries =array(635000.00, 420000.00, 260000.00, 350000.00, 250000.00, 90000.00); 

      /*****TAXATION***** 
      /* Creates if statements that runs trough the salaries and deducts tax rate accordingly for each employee*/ 

      /* Aron and taxes*/ 
      if ($salaries[0] >= 500000) 
      {$tax1=0.45;} 
      if ($salaries[0] >= 300000 and $salaries[0] < 500000) 
      {$tax1=0.35;} 
      if ($salaries[0] >= 200000 and $salaries[0] < 300000) 
      {$tax1=0.2;} 
      if ($salaries[0] >= 100000 and $salaries[0] < 200000) 
      {$tax1=0.1;} 
      if ($salaries[0] < 100000) 
      {$tax1=0;} 

      /* Britney and taxes*/ 
      if ($salaries[1] >= 500000) 
      {$tax2=0.45;} 
      if ($salaries[1] >= 300000 and $salaries[1] < 500000) 
      {$tax2=0.35;} 
      if ($salaries[1] >= 200000 and $salaries[1] < 300000) 
      {$tax2=0.2;} 
      if ($salaries[1] >= 100000 and $salaries[1] < 200000) 
      {$tax2=0.1;} 
      if ($salaries[1] < 100000) 
      {$tax2=0;} 

      /* Daniel and taxes*/ 
      if ($salaries[2] >= 500000) 
      {$tax3=0.45;} 
      if ($salaries[2] >= 300000 and $salaries[2] < 500000) 
      {$tax3=0.35;} 
      if ($salaries[2] >= 200000 and $salaries[2] < 300000) 
      {$tax3=0.2;} 
      if ($salaries[2] >= 100000 and $salaries[2] < 200000) 
      {$tax3=0.1;} 
      if ($salaries[2] < 100000) 
      {$tax3=0;} 

      /* Jessica and taxes*/ 
      if ($salaries[3] >= 500000) 
      {$tax4=0.45;} 
      if ($salaries[3] >= 300000 and $salaries[3] < 500000) 
      {$tax4=0.35;} 
      if ($salaries[3] >= 200000 and $salaries[3] < 300000) 
      {$tax4=0.2;} 
      if ($salaries[3] >= 100000 and $salaries[3] < 200000) 
      {$tax4=0.1;} 
      if ($salaries[3] < 100000) 
      {$tax4=0;} 

      /* Peter and taxes*/ 
      if ($salaries[4] >= 500000) 
      {$tax5=0.45; } 
      if ($salaries[4] >= 300000 and $salaries[4] < 500000) 
      {$tax5=0.35; } 
      if ($salaries[4] >= 200000 and $salaries[4] < 300000) 
      {$tax5=0.2; } 
      if ($salaries[4] >= 100000 and $salaries[4] < 200000) 
      {$tax5=0.1; } 
      if ($salaries[4] < 100000) 
      {$tax5=0; } 

      /* Keith and taxes*/ 
      if ($salaries[5] >= 500000) 
      {$tax6=0.45;} 
      if ($salaries[5] >= 300000 and $salaries[5] < 500000) 
      {$tax6=0.35;} 
      if ($salaries[5] >= 200000 and $salaries[5] < 300000) 
      {$tax6=0.2;} 
      if ($salaries[5] >= 100000 and $salaries[5] < 200000) 
      {$tax6=0.1;} 
      if ($salaries[5] < 100000) 
      {$tax6=0;} 

      /*****PENSION***** 
      Creates the variabel to deduct pension*/ 
      $pension = 0.025; 

      /*****ABC ARRAY***** 
      /*Sorts all the employees in a multiarray with their information. 
      It also does the tax-pension-salary*/ 

      $abc = array(
       'e_1'=>array('Aron','M','1930/01/25','Manager','1998/01/01',number_format($salaries[0],2,".",","),number_format($salaries[0]*$tax1,2,".",","),number_format($salaries[0]*$pension,2,".",","),number_format($salaries[0]-$salaries[0]*$pension-$salaries[0]*$tax1,2,".",",")), 
       'e_2'=>array('Britney','F','2001/05/06','Researcher','2001/03/15',number_format($salaries[1],2,".",","),number_format($salaries[1]*$tax2,2,".",","),number_format($salaries[1]*$pension,2,".",","),number_format($salaries[1]-$salaries[1]*$pension-$salaries[1]*$tax2,2,".",",")), 
       'e_3'=>array('Daniel','M','2003/01/15','Officer','2003/12/06',number_format($salaries[2],2,".",","),number_format($salaries[2]*$tax3,2,".",","),number_format($salaries[2]*$pension,2,".",","),number_format($salaries[2]-$salaries[2]*$pension-$salaries[2]*$tax3,2,".",",")), 
       'e_4'=>array('Jessica','F','2002/11/21','Officer','2007/02/20',number_format($salaries[3],2,".",","),number_format($salaries[3]*$tax4,2,".",","),number_format($salaries[3]*$pension,2,".",","),number_format($salaries[3]-$salaries[3]*$pension-$salaries[3]*$tax4,2,".",",")), 
       'e_5'=>array('Peter','M','1998/01/07','Assisant','2009/09/06',number_format($salaries[4],2,".",","),number_format($salaries[4]*$tax5,2,".",","),number_format($salaries[4]*$pension,2,".",","),number_format($salaries[4]-$salaries[4]*$pension-$salaries[4]*$tax5,2,".",",")), 
       'e_6'=>array('Keith','M','2003/07/25','Intern','2012/06/27',number_format($salaries[5],2,".",","),number_format($salaries[5]*$tax6,2,".",","),number_format($salaries[5]*$pension,2,".",","),number_format($salaries[5]-$salaries[5]*$pension-$salaries[5]*$tax6,2,".",","))); 

      foreach($abc as &$abct) 
      { 
      ?> 
      <tr> 
       <td align="left"> 
       <?php echo ($abct[0]);?> 
       </td> 
       <td> 
       <?php echo ($abct[1]);?> 
       </td> 
       <td> 
       <?php echo ($abct[2]);?> 
       </td> 
       <td align="left"> 
       <?php echo ($abct[3]);?> 
       </td> 
       <td> 
       <?php echo ($abct[4]);?> 
       </td> 
       <td align="right"> 
       <?php echo ($abct[5]);?> 
       </td> 
       <td align="right"> 
       <?php echo ($abct[6]);?> 
       </td> 
       <td align="right"> 
       <?php echo ($abct[7]);?> 
       </td> 
       <td align="right"> 
       <?php echo ($abct[8]);?> 
       </td> 
      </tr> 
      <?php 
       } 
      ?> 
     </table> 
    </div> 
</body> 
</html> 
+1

http://php.net/usort. Если вы можете сформулировать свои требования к сортировке, вы можете заставить его работать с usort() –

+0

Будет лучше, если вы приведете пример для моего массива @MikeB – Akmal

+0

@Akmal, почему бы вам не прочитать руководство и попробовать его сами –

ответ

0

Вы можете изменить ваш массив $ ABC так, чтобы каждый суб-массив также ассоциативный массив, так что ключи, которые могут быть использованы для сортировка указываются в виде строк, которые более легко значимые числовые показатели, а именно в этом простом примере данных:

$abc = array( 'rec_1' => array('fn'=>'Aron','ln'=>'Michaelson'), 
       'rec_2' => array('fn'=>'Abbey','ln'=>'Drake'), 
       'rec_3' => array('fn'=>'Alice','ln'=>'Peterson')); 

$ а являются, таким образом, ассоциативным массивом, суб-массивы имеют ключи, которые легко позволяют данным быть отсортировано по первому ('fn') или по имени ('ln').

Элегантный способ сортировки, например, LastName, чтобы использовать замыкание, следующим образом:

function build_sorter($key) { 
    return function ($a, $b) use ($key) { 
     return strnatcmp($a[$key], $b[$key]); 
    }; 
} 

usort($abc, build_sorter('ln')); 

build_sorter принимает ключ в качестве параметра, и этот аргумент будет связанной переменной для закрытия, что функция возвращается. usort будет использовать это замыкание, которое представляет собой функцию сравнения, возвращаемое значение которой является целым числом, указывающим, являются ли сравниваемые значения одинаковыми или если один больше другого.

результатов может быть получен с помощью следующего кода:

foreach ($abc as $item) { 
    echo strtoupper($item['ln']) . ', ' . $item['fn'] . "\n"; 
} 

// output: 

DRAKE, Abbey 
MICHAELSON, Aron 
PETERSON, Alice 

Если по какой-то причине вы не хотите использовать функции с именами, вы можете также достичь тех же результатов с помощью такого рода коды:

Примечание: этот strnatcmp полезен для обработки данных, которые могут содержать числовые строки, и сравнение будет в большей степени соответствовать тому, что мы, естественно, ожидаем от того, как люди заказывают такие ценности. Вы можете просмотреть эти примеры по адресу: http://3v4l.org/fng8h, а также по адресу http://3v4l.org/QYt9S

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