2015-01-01 2 views
0

Этот массив устанавливается с использованием имен файлов в данной папке. Мои имена файлов будут в следующем формате:Разделение массива 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 

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

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

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

$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'] (http://php.net/manual/en/class.filesystemiterator.php) rathar, чем 'scandir' или 'glob' – diEcho

ответ

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

Похоже, что было бы идеально, но $ combined = array_combine (['style', 'color', 'product'], explode ('_', $ file, 3)); создает синтаксическую ошибку, с которой я не могу найти работу. – ejd05

+0

@ ejd05: Я отредактировал свой ответ, повторите попытку. – CentaurWarchief

+0

Да, я как раз собирался добавить объявление как массив работал. Спасибо! – ejd05

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); 
Смежные вопросы