Advertisement
zero50x

С PHP сортировка массива по ключу

Jan 30th, 2018
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.49 KB | None | 0 0
  1. <?php
  2. error_reporting(E_ALL | E_STRICT); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE);
  3.  
  4. // Есть 2 массива. Задача: отсортировать второй массив по ключу need точно в том порядке, который стоит в ключе в первом массиве.
  5. // Т.е. если д11 в первом массиве на первом месте, то во втором массиве элемент с ним тоже должен быть на первом месте.
  6.  
  7. $t1 = microtime(true);
  8.  
  9. $sample = array(
  10.     '231' => 'д11',
  11.     '230' => 'д10',
  12.     '232' => 'д12',
  13.     '233' => 'д13',
  14.     '234' => 'д14',
  15.     '235' => 'д15',
  16.     '236' => 'д16',
  17.     '237' => 'д17',
  18.     '238' => 'д18',
  19.     '239' => 'д19',
  20. );
  21.  
  22. $arr = array(
  23.     '230' => array('need' => 'д10', 'oth' => 'a'),
  24.     '231' => array('need' => 'д11', 'oth' => 'b'),
  25.     '232' => array('need' => 'д12', 'oth' => 'c'),
  26.     '233' => array('need' => 'д13', 'oth' => 'd'),
  27.     '234' => array('need' => 'д14', 'oth' => 'd'),
  28.     '235' => array('need' => 'д15', 'oth' => 'd'),
  29.     '236' => array('need' => 'д16', 'oth' => 'd'),
  30.     '237' => array('need' => 'д17', 'oth' => 'd'),
  31.     '238' => array('need' => 'д18', 'oth' => 'd'),
  32.     '239' => array('need' => 'д19', 'oth' => 'd'),
  33. );
  34.  
  35. function search($arr, $sample, $new = [])
  36. {
  37.     foreach ($sample as $num => $D) {
  38.         foreach ($arr as $key => $value) {
  39.             if($arr[$key]['need'] == $D){
  40.                 $new[] = $value;
  41.                 unset($arr[$key]);
  42.  
  43.                 $j = count($arr);
  44.  
  45.                 if($j > 0){
  46.                     search($arr, $sample, $new);
  47.                 } else {
  48.                     return $new;
  49.                 }
  50.             }
  51.         }
  52.     }
  53. }
  54.  
  55. $bb = search($arr, $sample);
  56.  
  57. $t2 = microtime(true);
  58.  
  59. //echo "<pre>"; var_dump($bb); echo "</pre>";
  60.  
  61.  
  62.  
  63.  
  64. usort($arr, function($a, $b) use ($sample) {
  65.     $sample = array_flip($sample);
  66.     return strcmp($sample[$a['need']], $sample[$b['need']]);
  67. });
  68.  
  69. $t3 = microtime(true);
  70.  
  71. // Давайте ещё упростим с помощью функции array_multisort
  72.  
  73. array_multisort(array_column($arr, 'need'), $arr);
  74.  
  75. // Агонь! Это от 7 до 10 раз быстрее чем usort!!
  76.  
  77.  
  78. echo "<pre>"; var_dump($bb); echo "</pre>";
  79.  
  80. echo "<pre>"; var_dump($arr); echo "</pre>";
  81.  
  82.  
  83. $f1 = $t2 - $t1;
  84. $f2 = $t3 - $t2;
  85.  
  86. echo "f1 = $f1<br>";
  87. echo "f2 = $f2<br>";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement