PHP разделить массив путем сопоставления имен переменных

0

Этот массив устанавливается с использованием имен файлов в данной папке. Мои имена файлов будут в следующем формате:

style1_color1_product1_0000.png
style1_color1_product2_0001.png
style1_color1_product3_0002.png

style1_color2_product1_0003.png
style1_color2_product2_0004.png

style2_color1_product1_0005.png 

Ни одно из названий файлов не будет дублироваться, и всегда будет больше одного продукта для каждого стиля и цвета.

То, что я пытаюсь сделать, это взять этот массив и разбить его на новые массивы на основе соответствия значений "стиль" и "цвет".

Я дошел до открытия файла и разбил новый массив на основе первого и второго имен, но я не могу найти ответ на группировку в новые массивы.

$Dir = "products";

$files = scandir($Dir);

array_multisort($files, SORT_STRING);

for ($key = 0, $size = count($files); $key < $size; $key++) {

    if ($files[$key] != '.' && $files[$key] != '..'){

        $new_array[] = explode('_', $files[$key], 3);
    }

}

print_r($new_array);

Array ( [0] => 
    Array ( [0] => style1 [1] => color1 [2] => product1_0000.png ) [1] => 
    Array ( [0] => style1 [1] => color1 [2] => product2_0001.png ) [2] => 
    Array ( [0] => style1 [1] => color1 [2] => product2_0002.png ) [3] => )
)


etc 

Теперь мне нужно сравнить и разделить с исходным массивом.

Любая помощь будет оценена по достоинству.

  • 0
    Так что сделайте несколько циклов foreach . Вы даже можете сделать это в текущем for цикла
  • 0
    Совет: вы должны искать функцию SPL FilesystemIterator скорее, чем scandir или glob
Теги:
arrays
match

2 ответа

1

Ваш код можно сделать более простым с простым регулярным выражением:

$files = glob($Dir."/*.png");
$results = array();
foreach($files as $file) {
    if( preg_match("/style(?<style>\d+)_color(?<color>\d+)_product(?<product>\d+)_(?<id>\d+)\.png/",$file,$match) {
        // you now have $match['style'], $match['color'], $match['product']
        // and $match['id'] for the parts of the filename,
        // and $match[0] for the whole thing
        if( !isset($results[$match['style']])) $results[$match['style']] = array();
        if( !isset($results[$match['style']][$match['color']])) $results[$match['style']][$match['color']] = array();
        $results[$match['style']][$match['color']][$match['product']] = $match['id'];
    }
}
var_dump($results);
0

Проверьте, подходит ли это для вас:

<?php

$files = array(
    'style1_color1_product1_0000.png',
    'style1_color1_product2_0001.png',
    'style1_color1_product3_0002.png',
    'style1_color2_product1_0003.png',
    'style1_color2_product2_0004.png',
    'style2_color1_product1_0005.png'
);

array_multisort(
    $files,
    SORT_STRING
);

$newArr = array();

foreach ($files as $file) {
    $combined = array_combine(
        array(
            'style',
            'color',
            'product'
        ),
        explode(
            '_',
            $file,
            3
        )
    );

    $newArr[$combined['style']][$combined['color']][] = $combined['product'];
}

Приведет к:

Array
(
    [style1] => Array
        (
            [color1] => Array
                (
                    [0] => product1_0000.png
                    [1] => product2_0001.png
                    [2] => product3_0002.png
                )

            [color2] => Array
                (
                    [0] => product1_0003.png
                    [1] => product2_0004.png
                )

        )

    [style2] => Array
        (
            [color1] => Array
                (
                    [0] => product1_0005.png
                )

        )

)
  • 0
    Похоже, это было бы идеально, но $ комбинированный = array_combine (['style', 'color', 'product'], explode ('_', $ file, 3)); выдает синтаксическую ошибку, для которой я не могу обойти.
  • 0
    @ ejd05: я отредактировал свой ответ, попробуйте еще раз.
Показать ещё 1 комментарий

Ещё вопросы

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