php - перестановка массива в группы

0

У меня есть массив имен файлов:

 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 чтобы собрать их вместе.

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

Теги:
arrays

4 ответа

0
Лучший ответ

Просто отработал его теперь на основе другого сообщения в stackoverflow:

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

Вывод:

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;
}

Пример находится здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню