Этот массив устанавливается с использованием имен файлов в данной папке. Мои имена файлов будут в следующем формате:
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
Теперь мне нужно сравнить и разделить с исходным массивом.
Любая помощь будет оценена.
Ваш код можно сделать намного проще с помощью простого регулярного выражения:
$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);
Проверьте, решает ли это для вас:
<?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
)
)
)