PHP通过匹配变量名来拆分数组

时间:2015-01-01 20:06:20

标签: php arrays regex match

使用给定文件夹中的文件名设置此数组。我的文件名将采用以下格式:

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 

现在我需要与原始数组进行比较和分割。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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
                )

        )

)