【问题标题】:PHP split array by matching variable namesPHP通过匹配变量名拆分数组
【发布时间】:2015-01-01 20:06:20
【问题描述】:

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

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 

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

任何帮助将不胜感激。

【问题讨论】:

  • 一些foreach 循环也是如此。你甚至可以在你当前的 for 循环中做到这一点
  • 提示:你必须寻找SPL函数FilesystemIteratorrathar而不是scandirglob

标签: php arrays regex match


【解决方案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);

【讨论】:

    【解决方案2】:

    检查这是否可以解决您的问题:

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

    【讨论】:

    • 看起来很完美但是 $combined = array_combine(['style', 'color', 'product'], explode('_', $file, 3));产生一个我找不到解决方法的语法错误。
    • 是的,我正要添加声明为数组有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多