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

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

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

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

То, что я пытаюсь сделать, это взять этот массив и разделить его на новые массивы, основанные на сопоставлении значений ‘style’ и ‘color’.

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

$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

Решение

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

$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);
1

Другие решения

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

<?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

По вопросам рекламы [email protected]