2013-09-19 4 views
-4

Я использую scandir() для создания массива имен файлов изображений в каталоге, который содержит файлы, такие как: R12345.jpg, R12345_2.jpg, R12346.jpg, R12346_2.jpg, R12346_3.jpg и т. Д.Как разбить массив на элементы на основе

Я хочу знать, что лучший способ разделить этот массив на следующие элементы:

R12345,,jpg 
R12345,2,jpg 
R12346,,jpg 
R12346,2,jpg 
R12346,3,jpg 

Спасибо.

+0

Есть ли закономерность в значения в массиве? Если этого не произойдет, вы не сможете его разбить. –

+0

Используйте регулярное выражение для соответствия частям имени файла. – Barmar

ответ

5

Вы можете попробовать:

$input = 'R12345_2.jpg'; 
$output = explode(',', str_replace(array('.', '_'), ',', $input); 

Это будет возвращает вас массив:

array (size=3) 
    0 => string 'R12345' (length=6) 
    1 => string '2' (length=1) 
    2 => string 'jpg' (length=3) 

Или с помощью регулярных выражений:

preg_match('/^([^_]*)_?(\d+)?\.(.*)$/', $input, $output); 

Выход:

array (size=4) 
    0 => string 'R12345.jpg' (length=10) 
    1 => string 'R12345' (length=6) 
    2 => string '' (length=0) 
    3 => string 'jpg' (length=3) 

С

array_shift($output); 

вы можете быстро удалить первый элемент.

+0

Это не будет правильно для 'R12345.jpg'. – Barmar

+0

@Barmar Вы правы, удалены. – hsz

+0

К сожалению, R12345 часть имени файла не соответствует длине .... – richardc

0

$files_arr //this contains your files 
$final_arr=array(); //this contains final array 

foreach($files_arr as $k=>$v) 
{ 
    $test_arr = explode('.',$v); 
    $t = explode('_',$test_arr[0]); 
    if(empty($t[1])) $t[1] = ''; 
    $t[2] = $test_arr[1]; 

    array_push($final_arr[$k],$t); 
} 
print_r($final_arr); 
+0

Это то же самое, что и первый ответ Хак, см. Мой комментарий. – Barmar

+0

Извините, пожалуйста, проверьте мои изменения. – Parixit

0

Использование explode() функции разделить исходный массив, а затем использовать preg_match разделить отдельные части:

$str = 'R12345.jpg, R12345_2.jpg, R12346.jpg, R12346_2.jpg, R12346_3.jpg'; 
$files = explode(',', $str); 

$result = array(); 
foreach ($files as $file) { 
    $matches = array(); 

    preg_match('/^([A-Za-z0-9]+)_?([0-9]*)\.(jpg|png|gif)/$', trim($file), $matches); 

    array_shift($matches); // Remove first match that is the whole file name 

    array_push($result, $matches); 
} 
0
<?php 
//Result of $files = implode(', ',$scandirResult); 
$files = 'R12345.jpg, R12345_2.jpg, R12346.jpg, R12346_2.jpg, R12346_3.jpg'; 
preg_match_all('#((R\d+)_?(\d*))\.(\w+)#',$files,$output); 
$result = array(); 
foreach($output[2] as $key => $name) 
{ 
    $result[] = array($name,$output[3][$key],$output[4][$key]); 
} 
echo '<pre>'.print_r($result,true).'</pre>'; 
?> 

Выход:

Array 
(
    [0] => Array 
     (
      [0] => R12345 
      [1] => 
      [2] => jpg 
     ) 

    [1] => Array 
     (
      [0] => R12345 
      [1] => 2 
      [2] => jpg 
     ) 

    [2] => Array 
     (
      [0] => R12346 
      [1] => 
      [2] => jpg 
     ) 

    [3] => Array 
     (
      [0] => R12346 
      [1] => 2 
      [2] => jpg 
     ) 

    [4] => Array 
     (
      [0] => R12346 
      [1] => 3 
      [2] => jpg 
     ) 

) 
+0

Именно так я и был. Спасибо @PeterSmith – richardc

Смежные вопросы