arrays.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. /**
  3. * arrays.php
  4. *
  5. * Copyright (c) 2004-2005 The SquirrelMail Project Team
  6. * Licensed under the GNU GPL. For full terms see the file COPYING.
  7. *
  8. * Contains utility functions for array operations
  9. *
  10. * @version $Id$
  11. * @package squirrelmail
  12. */
  13. /**
  14. * Swaps two array values by position and maintain keys
  15. *
  16. * @param array $a (recursive) array
  17. * @param mixed $v1 value 1
  18. * @param mixed $v2 value 2
  19. * @return bool $r true on success
  20. * @author Marc Groot Koerkamp
  21. */
  22. function sqm_array_swap_values(&$a,$v1,$v2) {
  23. $r = false;
  24. if (in_array($v1,$a) && in_array($v2,$a)) {
  25. $k1 = array_search($v1,$a);
  26. $k2 = array_search($v1,$a);
  27. $d = $a[$k1];
  28. $a[$k1] = $a[$k2];
  29. $a[$k2] = $d;
  30. $r = true;
  31. }
  32. return $r;
  33. }
  34. /**
  35. * Move array value 2 array values by position and maintain keys
  36. *
  37. * @param array $a (recursive) array
  38. * @param mixed $v value to move
  39. * @param int $p positions to move
  40. * @return bool $succes
  41. * @author Marc Groot Koerkamp
  42. */
  43. function sqm_array_kmove_value(&$a,$v,$p) {
  44. $r = false;
  45. $a_v = array_values($a);
  46. $a_k = array_keys($a);
  47. if (in_array($v, $a_v)) {
  48. $k = array_search($v, $a_v);
  49. $p_n = $k + $p;
  50. if ($p_n > 0 && $p_n < count($a_v)) {
  51. $d = $a_v[$k];
  52. $a_v[$k] = $a_v[$p_n];
  53. $a_v[$p_n] = $d;
  54. $d = $a_k[$k];
  55. $a_k[$k] = $a_k[$p_n];
  56. $a_k[$p_n] = $d;
  57. $r = array_combine($a_k, $a_v);
  58. if ($a !== false) {
  59. $a = $r;
  60. $r = true;
  61. }
  62. }
  63. }
  64. return $r;
  65. }
  66. /**
  67. * Move array value 2 array values by position. Does not maintain keys
  68. *
  69. * @param array $a (recursive) array
  70. * @param mixed $v value to move
  71. * @param int $p positions to move
  72. * @return bool $succes
  73. * @author Marc Groot Koerkamp
  74. */
  75. function sqm_array_move_value(&$a,$v,$p) {
  76. $r = false;
  77. $a_v = array_values($a);
  78. if (in_array($v, $a_v)) {
  79. $k = array_search($v, $a_v);
  80. $p_n = $k + $p;
  81. if ($p_n >= 0 && $p_n < count($a_v)) {
  82. $d = $a_v[$k];
  83. $a_v[$k] = $a_v[$p_n];
  84. $a_v[$p_n] = $d;
  85. $a = $a_v;
  86. $r = true;
  87. }
  88. }
  89. return $r;
  90. }
  91. /**
  92. * Retrieve an array value n positions relative to a reference value.
  93. *
  94. * @param array $a array
  95. * @param mixed $v reference value
  96. * @param int $p offset to reference value in positions
  97. * @return mixed $r false on failure (or if the found value is false)
  98. * @author Marc Groot Koerkamp
  99. */
  100. function sqm_array_get_value_by_offset($a,$v,$p) {
  101. $r = false;
  102. $a_v = array_values($a);
  103. if (in_array($v, $a_v)) {
  104. $k = array_search($v, $a_v);
  105. $p_n = $k + $p;
  106. if ($p_n >= 0 && $p_n < count($a_v)) {
  107. $r = $a_v[$p_n];
  108. }
  109. }
  110. return $r;
  111. }
  112. if (!function_exists('array_combine')) {
  113. /**
  114. * Creates an array by using one array for keys and another for its values (PHP 5)
  115. *
  116. * @param array $aK array keys
  117. * @param array $aV array values
  118. * @return mixed $r combined array on succes, false on failure
  119. * @author Marc Groot Koerkamp
  120. */
  121. function array_combine($aK, $aV) {
  122. $r = false;
  123. $iCaK = count($aK);
  124. $iCaV = count($aV);
  125. if ($iCaK && $iCaV && $iCaK == $iCaV) {
  126. $aC = array();
  127. for ($i=0;$i<$iCaK;++$i) {
  128. $aC[$aK[$i]] = $aV[$i];
  129. }
  130. $r = $aC;
  131. }
  132. return $r;
  133. }
  134. }