Mercurial > judyates
comparison e2gallerypro/e2upload/Backend/Assets/getid3/module.misc.iso.php @ 3:3f6b44aa6b35 judyates
[svn r4] added ability to buy stuff, from a Prints page, but it doesn't work well with the css, and it also has not been fitted into the perl make system.
author | rlm |
---|---|
date | Mon, 22 Feb 2010 08:02:39 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
2:670229c4eb4b | 3:3f6b44aa6b35 |
---|---|
1 <?php | |
2 // +----------------------------------------------------------------------+ | |
3 // | PHP version 5 | | |
4 // +----------------------------------------------------------------------+ | |
5 // | Copyright (c) 2002-2006 James Heinrich, Allan Hansen | | |
6 // +----------------------------------------------------------------------+ | |
7 // | This source file is subject to version 2 of the GPL license, | | |
8 // | that is bundled with this package in the file license.txt and is | | |
9 // | available through the world-wide-web at the following url: | | |
10 // | http://www.gnu.org/copyleft/gpl.html | | |
11 // +----------------------------------------------------------------------+ | |
12 // | getID3() - http://getid3.sourceforge.net or http://www.getid3.org | | |
13 // +----------------------------------------------------------------------+ | |
14 // | Authors: James Heinrich <infoØgetid3*org> | | |
15 // | Allan Hansen <ahØartemis*dk> | | |
16 // +----------------------------------------------------------------------+ | |
17 // | module.misc.iso.php | | |
18 // | Module for analyzing ISO files | | |
19 // | dependencies: NONE | | |
20 // +----------------------------------------------------------------------+ | |
21 // | |
22 // $Id: module.misc.iso.php,v 1.3 2006/11/02 10:48:02 ah Exp $ | |
23 | |
24 | |
25 | |
26 class getid3_iso extends getid3_handler | |
27 { | |
28 | |
29 public function Analyze() { | |
30 | |
31 $getid3 = $this->getid3; | |
32 | |
33 $getid3->info['fileformat'] = 'iso'; | |
34 | |
35 for ($i = 16; $i <= 19; $i++) { | |
36 fseek($getid3->fp, 2048 * $i, SEEK_SET); | |
37 $iso_header = fread($getid3->fp, 2048); | |
38 if (substr($iso_header, 1, 5) == 'CD001') { | |
39 switch (ord($iso_header{0})) { | |
40 case 1: | |
41 $getid3->info['iso']['primary_volume_descriptor']['offset'] = 2048 * $i; | |
42 $this->ParsePrimaryVolumeDescriptor($iso_header); | |
43 break; | |
44 | |
45 case 2: | |
46 $getid3->info['iso']['supplementary_volume_descriptor']['offset'] = 2048 * $i; | |
47 $this->ParseSupplementaryVolumeDescriptor($iso_header); | |
48 break; | |
49 | |
50 default: | |
51 // skip | |
52 break; | |
53 } | |
54 } | |
55 } | |
56 | |
57 $this->ParsePathTable(); | |
58 | |
59 $getid3->info['iso']['files'] = array (); | |
60 foreach ($getid3->info['iso']['path_table']['directories'] as $directory_num => $directory_data) { | |
61 $getid3->info['iso']['directories'][$directory_num] = $this->ParseDirectoryRecord($directory_data); | |
62 } | |
63 | |
64 return true; | |
65 } | |
66 | |
67 | |
68 | |
69 private function ParsePrimaryVolumeDescriptor(&$iso_header) { | |
70 | |
71 $getid3 = $this->getid3; | |
72 | |
73 // ISO integer values are stored *BOTH* Little-Endian AND Big-Endian format!! | |
74 // ie 12345 == 0x3039 is stored as $39 $30 $30 $39 in a 4-byte field | |
75 | |
76 $getid3->info['iso']['primary_volume_descriptor']['raw'] = array (); | |
77 $info_iso_primaryVD = &$getid3->info['iso']['primary_volume_descriptor']; | |
78 $info_iso_primaryVD_raw = &$info_iso_primaryVD['raw']; | |
79 | |
80 $info_iso_primaryVD_raw['volume_descriptor_type'] = getid3_lib::LittleEndian2Int(substr($iso_header, 0, 1)); | |
81 $info_iso_primaryVD_raw['standard_identifier'] = substr($iso_header, 1, 5); | |
82 if ($info_iso_primaryVD_raw['standard_identifier'] != 'CD001') { | |
83 throw new getid3_exception('Expected "CD001" at offset ('.($info_iso_primaryVD['offset'] + 1).'), found "'.$info_iso_primaryVD_raw['standard_identifier'].'" instead'); | |
84 } | |
85 | |
86 getid3_lib::ReadSequence('LittleEndian2Int', $info_iso_primaryVD_raw, $iso_header, 6, | |
87 array ( | |
88 'volume_descriptor_version' => 1, | |
89 'IGNORE-unused_1' => 1, | |
90 'system_identifier' => -32, // string | |
91 'volume_identifier' => -32, // string | |
92 'IGNORE-unused_2' => 8, | |
93 'volume_space_size' => 4, | |
94 'IGNORE-1' => 4, | |
95 'IGNORE-unused_3' => 32, | |
96 'volume_set_size' => 2, | |
97 'IGNORE-2' => 2, | |
98 'volume_sequence_number' => 2, | |
99 'IGNORE-3' => 2, | |
100 'logical_block_size' => 2, | |
101 'IGNORE-4' => 2, | |
102 'path_table_size' => 4, | |
103 'IGNORE-5' => 4, | |
104 'path_table_l_location' => 2, | |
105 'IGNORE-6' => 2, | |
106 'path_table_l_opt_location' => 2, | |
107 'IGNORE-7' => 2, | |
108 'path_table_m_location' => 2, | |
109 'IGNORE-8' => 2, | |
110 'path_table_m_opt_location' => 2, | |
111 'IGNORE-9' => 2, | |
112 'root_directory_record' => -34, // string | |
113 'volume_set_identifier' => -128, // string | |
114 'publisher_identifier' => -128, // string | |
115 'data_preparer_identifier' => -128, // string | |
116 'application_identifier' => -128, // string | |
117 'copyright_file_identifier' => -37, // string | |
118 'abstract_file_identifier' => -37, // string | |
119 'bibliographic_file_identifier' => -37, // string | |
120 'volume_creation_date_time' => -17, // string | |
121 'volume_modification_date_time' => -17, // string | |
122 'volume_expiration_date_time' => -17, // string | |
123 'volume_effective_date_time' => -17, // string | |
124 'file_structure_version' => 1, | |
125 'IGNORE-unused_4' => 1, | |
126 'application_data' => -512 // string | |
127 ) | |
128 ); | |
129 | |
130 $info_iso_primaryVD['system_identifier'] = trim($info_iso_primaryVD_raw['system_identifier']); | |
131 $info_iso_primaryVD['volume_identifier'] = trim($info_iso_primaryVD_raw['volume_identifier']); | |
132 $info_iso_primaryVD['volume_set_identifier'] = trim($info_iso_primaryVD_raw['volume_set_identifier']); | |
133 $info_iso_primaryVD['publisher_identifier'] = trim($info_iso_primaryVD_raw['publisher_identifier']); | |
134 $info_iso_primaryVD['data_preparer_identifier'] = trim($info_iso_primaryVD_raw['data_preparer_identifier']); | |
135 $info_iso_primaryVD['application_identifier'] = trim($info_iso_primaryVD_raw['application_identifier']); | |
136 $info_iso_primaryVD['copyright_file_identifier'] = trim($info_iso_primaryVD_raw['copyright_file_identifier']); | |
137 $info_iso_primaryVD['abstract_file_identifier'] = trim($info_iso_primaryVD_raw['abstract_file_identifier']); | |
138 $info_iso_primaryVD['bibliographic_file_identifier'] = trim($info_iso_primaryVD_raw['bibliographic_file_identifier']); | |
139 | |
140 $info_iso_primaryVD['volume_creation_date_time'] = getid3_iso::ISOtimeText2UNIXtime($info_iso_primaryVD_raw['volume_creation_date_time']); | |
141 $info_iso_primaryVD['volume_modification_date_time'] = getid3_iso::ISOtimeText2UNIXtime($info_iso_primaryVD_raw['volume_modification_date_time']); | |
142 $info_iso_primaryVD['volume_expiration_date_time'] = getid3_iso::ISOtimeText2UNIXtime($info_iso_primaryVD_raw['volume_expiration_date_time']); | |
143 $info_iso_primaryVD['volume_effective_date_time'] = getid3_iso::ISOtimeText2UNIXtime($info_iso_primaryVD_raw['volume_effective_date_time']); | |
144 | |
145 if (($info_iso_primaryVD_raw['volume_space_size'] * 2048) > $getid3->info['filesize']) { | |
146 throw new getid3_exception('Volume Space Size ('.($info_iso_primaryVD_raw['volume_space_size'] * 2048).' bytes) is larger than the file size ('.$getid3->info['filesize'].' bytes) (truncated file?)'); | |
147 } | |
148 | |
149 return true; | |
150 } | |
151 | |
152 | |
153 | |
154 private function ParseSupplementaryVolumeDescriptor(&$iso_header) { | |
155 | |
156 $getid3 = $this->getid3; | |
157 | |
158 // ISO integer values are stored Both-Endian format!! | |
159 // ie 12345 == 0x3039 is stored as $39 $30 $30 $39 in a 4-byte field | |
160 | |
161 $getid3->info['iso']['supplementary_volume_descriptor']['raw'] = array (); | |
162 $info_iso_supplementaryVD = &$getid3->info['iso']['supplementary_volume_descriptor']; | |
163 $info_iso_supplementaryVD_raw = &$info_iso_supplementaryVD['raw']; | |
164 | |
165 $info_iso_supplementaryVD_raw['volume_descriptor_type'] = getid3_lib::LittleEndian2Int(substr($iso_header, 0, 1)); | |
166 $info_iso_supplementaryVD_raw['standard_identifier'] = substr($iso_header, 1, 5); | |
167 if ($info_iso_supplementaryVD_raw['standard_identifier'] != 'CD001') { | |
168 throw new getid3_exception('Expected "CD001" at offset ('.($info_iso_supplementaryVD['offset'] + 1).'), found "'.$info_iso_supplementaryVD_raw['standard_identifier'].'" instead'); | |
169 } | |
170 | |
171 getid3_lib::ReadSequence('LittleEndian2Int', $info_iso_supplementaryVD_raw, $iso_header, 6, | |
172 array ( | |
173 'volume_descriptor_version' => 1, | |
174 'IGNORE-unused_1' => -1, | |
175 'system_identifier' => -32, | |
176 'volume_identifier' => -32, | |
177 'IGNORE-unused_2' => -8, | |
178 'volume_space_size' => 4, | |
179 'IGNORE-1' => 4, | |
180 'IGNORE-unused_3' => -32, | |
181 'volume_set_size' => 2, | |
182 'IGNORE-2' => 2, | |
183 'volume_sequence_number' => 2, | |
184 'IGNORE-3' => 2, | |
185 'logical_block_size' => 2, | |
186 'IGNORE-4' => 2, | |
187 'path_table_size' => 4, | |
188 'IGNORE-5' => 4, | |
189 'path_table_l_location' => 2, | |
190 'IGNORE-6' => 2, | |
191 'path_table_l_opt_location' => 2, | |
192 'IGNORE-7' => 2, | |
193 'path_table_m_location' => 2, | |
194 'IGNORE-8' => 2, | |
195 'path_table_m_opt_location' => 2, | |
196 'IGNORE-9' => 2, | |
197 'root_directory_record' => -34, | |
198 'volume_set_identifier' => -128, | |
199 'publisher_identifier' => -128, | |
200 'data_preparer_identifier' => -128, | |
201 'application_identifier' => -128, | |
202 'copyright_file_identifier' => -37, | |
203 'abstract_file_identifier' => -37, | |
204 'bibliographic_file_identifier' => -37, | |
205 'volume_creation_date_time' => -17, | |
206 'volume_modification_date_time' => -17, | |
207 'volume_expiration_date_time' => -17, | |
208 'volume_effective_date_time' => -17, | |
209 'file_structure_version' => 1, | |
210 'IGNORE-unused_4' => 1, | |
211 'application_data' => -512 | |
212 ) | |
213 ); | |
214 | |
215 $info_iso_supplementaryVD['system_identifier'] = trim($info_iso_supplementaryVD_raw['system_identifier']); | |
216 $info_iso_supplementaryVD['volume_identifier'] = trim($info_iso_supplementaryVD_raw['volume_identifier']); | |
217 $info_iso_supplementaryVD['volume_set_identifier'] = trim($info_iso_supplementaryVD_raw['volume_set_identifier']); | |
218 $info_iso_supplementaryVD['publisher_identifier'] = trim($info_iso_supplementaryVD_raw['publisher_identifier']); | |
219 $info_iso_supplementaryVD['data_preparer_identifier'] = trim($info_iso_supplementaryVD_raw['data_preparer_identifier']); | |
220 $info_iso_supplementaryVD['application_identifier'] = trim($info_iso_supplementaryVD_raw['application_identifier']); | |
221 $info_iso_supplementaryVD['copyright_file_identifier'] = trim($info_iso_supplementaryVD_raw['copyright_file_identifier']); | |
222 $info_iso_supplementaryVD['abstract_file_identifier'] = trim($info_iso_supplementaryVD_raw['abstract_file_identifier']); | |
223 $info_iso_supplementaryVD['bibliographic_file_identifier'] = trim($info_iso_supplementaryVD_raw['bibliographic_file_identifier']); | |
224 | |
225 $info_iso_supplementaryVD['volume_creation_date_time'] = getid3_iso::ISOtimeText2UNIXtime($info_iso_supplementaryVD_raw['volume_creation_date_time']); | |
226 $info_iso_supplementaryVD['volume_modification_date_time'] = getid3_iso::ISOtimeText2UNIXtime($info_iso_supplementaryVD_raw['volume_modification_date_time']); | |
227 $info_iso_supplementaryVD['volume_expiration_date_time'] = getid3_iso::ISOtimeText2UNIXtime($info_iso_supplementaryVD_raw['volume_expiration_date_time']); | |
228 $info_iso_supplementaryVD['volume_effective_date_time'] = getid3_iso::ISOtimeText2UNIXtime($info_iso_supplementaryVD_raw['volume_effective_date_time']); | |
229 | |
230 if (($info_iso_supplementaryVD_raw['volume_space_size'] * $info_iso_supplementaryVD_raw['logical_block_size']) > $getid3->info['filesize']) { | |
231 throw new getid3_exception('Volume Space Size ('.($info_iso_supplementaryVD_raw['volume_space_size'] * $info_iso_supplementaryVD_raw['logical_block_size']).' bytes) is larger than the file size ('.$getid3->info['filesize'].' bytes) (truncated file?)'); | |
232 } | |
233 | |
234 return true; | |
235 } | |
236 | |
237 | |
238 | |
239 private function ParsePathTable() { | |
240 | |
241 $getid3 = $this->getid3; | |
242 | |
243 if (!isset($getid3->info['iso']['supplementary_volume_descriptor']['raw']['path_table_l_location']) && !isset($getid3->info['iso']['primary_volume_descriptor']['raw']['path_table_l_location'])) { | |
244 return false; | |
245 } | |
246 if (isset($getid3->info['iso']['supplementary_volume_descriptor']['raw']['path_table_l_location'])) { | |
247 $path_table_location = $getid3->info['iso']['supplementary_volume_descriptor']['raw']['path_table_l_location']; | |
248 $path_table_size = $getid3->info['iso']['supplementary_volume_descriptor']['raw']['path_table_size']; | |
249 $text_encoding = 'UTF-16BE'; // Big-Endian Unicode | |
250 } | |
251 else { | |
252 $path_table_location = $getid3->info['iso']['primary_volume_descriptor']['raw']['path_table_l_location']; | |
253 $path_table_size = $getid3->info['iso']['primary_volume_descriptor']['raw']['path_table_size']; | |
254 $text_encoding = 'ISO-8859-1'; // Latin-1 | |
255 } | |
256 | |
257 if (($path_table_location * 2048) > $getid3->info['filesize']) { | |
258 throw new getid3_exception('Path Table Location specifies an offset ('.($path_table_location * 2048).') beyond the end-of-file ('.$getid3->info['filesize'].')'); | |
259 } | |
260 | |
261 $getid3->info['iso']['path_table']['offset'] = $path_table_location * 2048; | |
262 fseek($getid3->fp, $getid3->info['iso']['path_table']['offset'], SEEK_SET); | |
263 $getid3->info['iso']['path_table']['raw'] = fread($getid3->fp, $path_table_size); | |
264 | |
265 $offset = 0; | |
266 $pathcounter = 1; | |
267 while ($offset < $path_table_size) { | |
268 | |
269 $getid3->info['iso']['path_table']['directories'][$pathcounter] = array (); | |
270 $info_iso_pathtable_directories_current = &$getid3->info['iso']['path_table']['directories'][$pathcounter]; | |
271 | |
272 getid3_lib::ReadSequence('LittleEndian2Int', $info_iso_pathtable_directories_current, $getid3->info['iso']['path_table']['raw'], $offset, | |
273 array ( | |
274 'length' => 1, | |
275 'extended_length' => 1, | |
276 'location_logical' => 4, | |
277 'parent_directory' => 2, | |
278 ) | |
279 ); | |
280 | |
281 $info_iso_pathtable_directories_current['name'] = substr($getid3->info['iso']['path_table']['raw'], $offset+8, $info_iso_pathtable_directories_current['length']); | |
282 | |
283 $offset += 8 + $info_iso_pathtable_directories_current['length'] + ($info_iso_pathtable_directories_current['length'] % 2); | |
284 | |
285 $info_iso_pathtable_directories_current['name_ascii'] = $getid3->iconv($text_encoding, $getid3->encoding, $info_iso_pathtable_directories_current['name'], true); | |
286 | |
287 $info_iso_pathtable_directories_current['location_bytes'] = $info_iso_pathtable_directories_current['location_logical'] * 2048; | |
288 if ($pathcounter == 1) { | |
289 $info_iso_pathtable_directories_current['full_path'] = '/'; | |
290 } | |
291 else { | |
292 $info_iso_pathtable_directories_current['full_path'] = $getid3->info['iso']['path_table']['directories'][$info_iso_pathtable_directories_current['parent_directory']]['full_path'].$info_iso_pathtable_directories_current['name_ascii'].'/'; | |
293 } | |
294 $full_path_array[] = $info_iso_pathtable_directories_current['full_path']; | |
295 | |
296 $pathcounter++; | |
297 } | |
298 | |
299 return true; | |
300 } | |
301 | |
302 | |
303 | |
304 private function ParseDirectoryRecord($directory_data) { | |
305 | |
306 $getid3 = $this->getid3; | |
307 | |
308 $text_encoding = isset($getid3->info['iso']['supplementary_volume_descriptor']) ? 'UTF-16BE' : 'ISO-8859-1'; | |
309 | |
310 fseek($getid3->fp, $directory_data['location_bytes'], SEEK_SET); | |
311 $directory_record_data = fread($getid3->fp, 1); | |
312 | |
313 while (ord($directory_record_data{0}) > 33) { | |
314 | |
315 $directory_record_data .= fread($getid3->fp, ord($directory_record_data{0}) - 1); | |
316 | |
317 $this_directory_record = array (); | |
318 $this_directory_record['raw'] = array (); | |
319 $this_directory_record_raw = &$this_directory_record['raw']; | |
320 | |
321 getid3_lib::ReadSequence('LittleEndian2Int', $this_directory_record_raw, $directory_record_data, 0, | |
322 array ( | |
323 'length' => 1, | |
324 'extended_attribute_length' => 1, | |
325 'offset_logical' => 4, | |
326 'IGNORE-1' => 4, | |
327 'filesize' => 4, | |
328 'IGNORE-2' => 4, | |
329 'recording_date_time' => -7, | |
330 'file_flags' => 1, | |
331 'file_unit_size' => 1, | |
332 'interleave_gap_size' => 1, | |
333 'volume_sequence_number' => 2, | |
334 'IGNORE-3' => 2, | |
335 'file_identifier_length' => 1, | |
336 ) | |
337 ); | |
338 | |
339 $this_directory_record_raw['file_identifier'] = substr($directory_record_data, 33, $this_directory_record_raw['file_identifier_length']); | |
340 | |
341 $this_directory_record['file_identifier_ascii'] = $getid3->iconv($text_encoding, $getid3->encoding, $this_directory_record_raw['file_identifier'], true); | |
342 $this_directory_record['filesize'] = $this_directory_record_raw['filesize']; | |
343 $this_directory_record['offset_bytes'] = $this_directory_record_raw['offset_logical'] * 2048; | |
344 $this_directory_record['file_flags']['hidden'] = (bool)($this_directory_record_raw['file_flags'] & 0x01); | |
345 $this_directory_record['file_flags']['directory'] = (bool)($this_directory_record_raw['file_flags'] & 0x02); | |
346 $this_directory_record['file_flags']['associated'] = (bool)($this_directory_record_raw['file_flags'] & 0x04); | |
347 $this_directory_record['file_flags']['extended'] = (bool)($this_directory_record_raw['file_flags'] & 0x08); | |
348 $this_directory_record['file_flags']['permissions'] = (bool)($this_directory_record_raw['file_flags'] & 0x10); | |
349 $this_directory_record['file_flags']['multiple'] = (bool)($this_directory_record_raw['file_flags'] & 0x80); | |
350 $this_directory_record['recording_timestamp'] = getid3_iso::ISOtime2UNIXtime($this_directory_record_raw['recording_date_time']); | |
351 | |
352 if ($this_directory_record['file_flags']['directory']) { | |
353 $this_directory_record['filename'] = $directory_data['full_path']; | |
354 } | |
355 else { | |
356 $this_directory_record['filename'] = $directory_data['full_path'].getid3_iso::ISOstripFilenameVersion($this_directory_record['file_identifier_ascii']); | |
357 $getid3->info['iso']['files'] = getid3_iso::array_merge_clobber($getid3->info['iso']['files'], getid3_iso::CreateDeepArray($this_directory_record['filename'], '/', $this_directory_record['filesize'])); | |
358 } | |
359 | |
360 $directory_record[] = $this_directory_record; | |
361 $directory_record_data = fread($getid3->fp, 1); | |
362 } | |
363 | |
364 return $directory_record; | |
365 } | |
366 | |
367 | |
368 | |
369 public static function ISOstripFilenameVersion($iso_filename) { | |
370 | |
371 // convert 'filename.ext;1' to 'filename.ext' | |
372 if (!strstr($iso_filename, ';')) { | |
373 return $iso_filename; | |
374 } | |
375 return substr($iso_filename, 0, strpos($iso_filename, ';')); | |
376 } | |
377 | |
378 | |
379 | |
380 public static function ISOtimeText2UNIXtime($iso_time) { | |
381 | |
382 if (!(int)substr($iso_time, 0, 4)) { | |
383 return false; | |
384 } | |
385 | |
386 return gmmktime((int)substr($iso_time, 8, 2), (int)substr($iso_time, 10, 2), (int)substr($iso_time, 12, 2), (int)substr($iso_time, 4, 2), (int)substr($iso_time, 6, 2), (int)substr($iso_time, 0, 4)); | |
387 } | |
388 | |
389 | |
390 | |
391 public static function ISOtime2UNIXtime($iso_time) { | |
392 | |
393 // Represented by seven bytes: | |
394 // 1: Number of years since 1900 | |
395 // 2: Month of the year from 1 to 12 | |
396 // 3: Day of the Month from 1 to 31 | |
397 // 4: Hour of the day from 0 to 23 | |
398 // 5: Minute of the hour from 0 to 59 | |
399 // 6: second of the minute from 0 to 59 | |
400 // 7: Offset from Greenwich Mean Time in number of 15 minute intervals from -48 (West) to +52 (East) | |
401 | |
402 return gmmktime(ord($iso_time[3]), ord($iso_time[4]), ord($iso_time[5]), ord($iso_time[1]), ord($iso_time[2]), ord($iso_time[0]) + 1900); | |
403 } | |
404 | |
405 | |
406 | |
407 public static function array_merge_clobber($array1, $array2) { | |
408 | |
409 // written by kcØhireability*com | |
410 // taken from http://www.php.net/manual/en/function.array-merge-recursive.php | |
411 | |
412 if (!is_array($array1) || !is_array($array2)) { | |
413 return false; | |
414 } | |
415 | |
416 $newarray = $array1; | |
417 foreach ($array2 as $key => $val) { | |
418 if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { | |
419 $newarray[$key] = getid3_iso::array_merge_clobber($newarray[$key], $val); | |
420 } else { | |
421 $newarray[$key] = $val; | |
422 } | |
423 } | |
424 return $newarray; | |
425 } | |
426 | |
427 | |
428 | |
429 public static function CreateDeepArray($array_path, $separator, $value) { | |
430 | |
431 // assigns $value to a nested array path: | |
432 // $foo = getid3_lib::CreateDeepArray('/path/to/my', '/', 'file.txt') | |
433 // is the same as: | |
434 // $foo = array ('path'=>array('to'=>'array('my'=>array('file.txt')))); | |
435 // or | |
436 // $foo['path']['to']['my'] = 'file.txt'; | |
437 | |
438 while ($array_path{0} == $separator) { | |
439 $array_path = substr($array_path, 1); | |
440 } | |
441 if (($pos = strpos($array_path, $separator)) !== false) { | |
442 return array (substr($array_path, 0, $pos) => getid3_iso::CreateDeepArray(substr($array_path, $pos + 1), $separator, $value)); | |
443 } | |
444 | |
445 return array ($array_path => $value); | |
446 } | |
447 | |
448 } | |
449 | |
450 ?> |