Guest User

Untitled

a guest
Oct 21st, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. <?php
  2.  
  3. $array = [1, 2, 3, 4, [], [5, 6], 7, 8, [9], [10, [11, 12], 13, [14, 15, 16, [17, [18, [19, 20, 21]]]]], 22, 23, 24, [25], 26, [27, [28], [29, [30, 31], [32], [33, [34, [35, 36], 37, 38, [39, 40]]]]]];
  4.  
  5. function laravel_flatten($array, $depth = INF)
  6. {
  7. return array_reduce($array, function ($result, $item) use ($depth) {
  8. if (! is_array($item)) {
  9. return array_merge($result, [$item]);
  10. } elseif ($depth === 1) {
  11. return array_merge($result, array_values($item));
  12. } else {
  13. return array_merge($result, laravel_flatten($item, $depth - 1));
  14. }
  15. }, []);
  16. }
  17.  
  18. function knapsack_flatten($collection, $levelsToFlatten = -1)
  19. {
  20. $generatorFactory = function () use ($collection, $levelsToFlatten) {
  21. $flattenNextLevel = $levelsToFlatten < 0 || $levelsToFlatten > 0;
  22. $childLevelsToFlatten = $levelsToFlatten > 0 ? $levelsToFlatten - 1 : $levelsToFlatten;
  23. foreach ($collection as $key => $value) {
  24. if ($flattenNextLevel && (is_array($value) || $value instanceof Traversable)) {
  25. foreach (knapsack_flatten($value, $childLevelsToFlatten) as $childKey => $childValue) {
  26. yield $childKey => $childValue;
  27. }
  28. } else {
  29. yield $key => $value;
  30. }
  31. }
  32. };
  33.  
  34. $collection = $generatorFactory();
  35.  
  36. $generatorFactory2 = function() use ($collection) {
  37. foreach ($collection as $value) {
  38. yield $value;
  39. }
  40. };
  41.  
  42. return iterator_to_array($generatorFactory2());
  43. }
  44.  
  45. $tests = [
  46. 'lstrojny/functional-php' => function ($array) {
  47. $stack = [$array];
  48. $result = [];
  49. while (!empty($stack)) {
  50. $item = array_shift($stack);
  51. if (is_array($item)) {
  52. foreach ($item as $element) {
  53. array_unshift($stack, $element);
  54. }
  55. } else {
  56. array_unshift($result, $item);
  57. }
  58. }
  59. return $result;
  60. },
  61. 'laravel collections' => 'laravel_flatten',
  62. 'dusank/knapsack' => 'knapsack_flatten',
  63. 'recursive_iterator' => function ($array) {
  64. return iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)), false);
  65. },
  66. 'array_walk_recursive' => function ($array) {
  67. $return = array();
  68. array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
  69.  
  70. return $return;
  71. },
  72. ];
  73.  
  74.  
  75. foreach ($tests as $suite => $closure) {
  76. $time = microtime(true);
  77. for ($i=0;$i<100000;$i++) {
  78. call_user_func($closure, $array);
  79. }
  80.  
  81. echo $suite.' finished in '.(microtime(true) - $time) . 's'.PHP_EOL;
  82. }
  83.  
  84. /*
  85. lstrojny/functional-php finished in 3.0966401100159s
  86. laravel collections finished in 2.0682859420776s
  87. dusank/knapsack finished in 4.2100491523743s
  88. recursive_iterator finished in 1.9282908439636s
  89. array_walk_recursive finished in 0.74895691871643s
  90. */
Add Comment
Please, Sign In to add comment