2015-03-12 4 views
0

У меня есть массив имен файлов:PHP - переставляя массив в группы

Array 
(
    [2] => 1_1_page2-img1.jpg 
    [3] => 1_2_page2-img1-big.jpg 
    [4] => 2_1_page2-img1.jpg 
    [5] => 2_2_page2-img1-big.jpg 
    [6] => 3_1_page2-img1.jpg 
    [7] => 4_1_page2-img1.jpg 
    [8] => 4_2_page2-img1.jpg 
    [9] => 5_2_page2-img1.jpg 
) 

Я пытаюсь изменить их таким образом, они сгруппированы по их первому номеру. Я предполагаю, что я мог бы разделить их на трубу, чтобы потом потом различить их. Либо это, либо многомерный массив.

Я знаю, что могу выполнить команду explode("_",$filename);, чтобы получить первую и вторую цифры перед символами подчеркивания.

Уловка даже при том, что начальные числа должны всегда увеличиваться, не обязательно должно быть 2 файла на начальный номер.

Так что я либо пытается сделать это в следующем:

Array 
    (
     [0] => 1_1_page2-img1.jpg|1_2_page2-img1-big.jpg 
     [1] => 2_1_page2-img1.jpg|2_2_page2-img1-big.jpg 
     [2] => 3_1_page2-img1.jpg| 
     [3] => 4_1_page2-img1.jpg|4_2_page2-img1.jpg 
     [4] => |5_2_page2-img1.jpg 
    ) 

Или что-то опрятнее возможно? Я просто не могу разобрать foreach, чтобы собрать их вместе.

Или есть команда, связанная с массивом, которая упростит их объединение?

ответ

0

Просто работал его теперь основан на другую должность в StackOverflow:

foreach ($scanned_directory as $filename){ 
     $ids = explode("_",$filename); 
     $groups[$ids[0]][] = $filename;  
    } 
    echo "<pre>"; 
    ksort($groups); 
    print_r($groups); 
    echo "</pre>"; 

Displays:

Array 
(
    [1] => Array 
     (
      [0] => 1_1_page2-img1.jpg 
      [1] => 1_2_page2-img1-big.jpg 
     ) 

    [2] => Array 
     (
      [0] => 2_1_page2-img1.jpg 
      [1] => 2_2_page2-img1-big.jpg 
     ) 

    [3] => Array 
     (
      [0] => 3_1_page2-img1.jpg 
      [1] => 3_2_page2-img1-big.jpg 
     ) 

    [10] => Array 
     (
      [0] => 10_1_page2-img1.jpg 
     ) 

    [11] => Array 
     (
      [0] => 11_2_page2-img1-big.jpg 
     ) 

) 
0

Мое предпочтение состояло в том, чтобы хранить их в подмассивах, так как с этим будет гораздо легче справиться в долгосрочной перспективе; так что это будет возможность, учитывая ваш массив в $arr:

$newarr = array(); 
while (list($key, $val) = each($arr)) { 

    $subarray_index = substr($val, 0, strpos($val, "_")); 
    $newarr[$subarray_index][] = $val; 
} 
0

Это то, что вы имеете в виду?

$arr = Array(
2 => '1_1_page2-img1.jpg', 
3 => '1_2_page2-img1-big.jpg', 
4 => '2_1_page2-img1.jpg', 
5 => '2_2_page2-img1-big.jpg', 
6 => '3_1_page2-img1.jpg', 
7 => '4_1_page2-img1.jpg', 
8 => '4_2_page2-img1.jpg', 
9 => '5_2_page2-img1.jpg' 
); 


function orderArray($pArr){ 
    $first = '0'; 
    $newArr = array(); 
    foreach($pArr as $val){ 
     if(strpos($val,$first) !== 0){ 
     if(substr($val,2,1)==='1'){ 
      $newArr[]=$val; 
     }else{ 
      $newArr[]='|'.$val; 
     } 
     $first = substr($val,0,1); 
     }else{ 
     $curIndex = count($newArr) - 1; 
     $newArr[$curIndex] = $newArr[$curIndex].'|'.$val; 
     } 
     return $newArr; 
    } 

$result = orderArray($arr); 

print "number of values: ".count($result)."<br>"; 
foreach($result as $value){ 
    print $value."<br>"; 
} 
0

Там не является хорошим автоматизированным способ сделать это, но вы могли бы используйте простой цикл:

$array = []; 

foreach ($filename as $file) { 
    $fields = explode('_', $file); 
    $array[$fields[0]][$fields[1]] = $file; 
} 

Примером является located here.