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