根据preg匹配条件在foreach循环中合并值

时间:2018-12-29 00:09:26

标签: php arrays loops

在foreach循环中,我一直尝试访问和操作数组中的某些名称/值对,但均未成功。

我的数据在这样的数组中:

[0] => Array
    (
        [subject] => math
        [price] => 5
        [year] => 2006
    )

[1] => Array
    (
        [subject] => reading
        [price] => 7
        [year] => 2007                                              
        [author] => Smith
        [publisher] => Press
    )

[2] => Array
    (
        [subject] => reading
        [price] => 9        
        [year] => 2008                                                              
        [author] => Jones
        [copyright] => 1999
    )

我的代码是:

$count = count($array); 
for ($i = 0; $i < $count; $i++) {
        foreach($array[$i] as $name => $value) {
                if(preg_match('(subject|price|year)', $name) != 1) { 
                        @$desc .= '-'.$name.'-'.$value;
                } else {
                        $desc = ''; 
                }
                echo $i.' : '.$desc.'<br />';
        }                       
}

从上面的代码中我期望的输出将是:

0 : subject-math / price-5 / year-2006
1 : subject-reading / price-7 / year-2007 / author-Smith-publisher-Press
2 : subject-reading / price-9 / year-2008 / author-Jones-copyright-1999

我面临的主要问题是我不知道如何组合和回显所有不符合preg_match条件的名称值对。从本质上讲,每条记录的主题,价格和年份均相同,但我希望能够访问的所有其他记录都合并为一项。

在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

此代码将执行您想要的操作。它遍历数组,将所有键值对推入数组,然后回显该数组的爆破(用/)。 subjectpriceyear的值具有其自己的条目,而所有其他值均被推入数组,然后使用-进行内插以提供所需的输出。与其使用preg_match来匹配密钥,不如使用一个简单的in_array

foreach ($data as $k => $d) {
    $out = array();
    foreach ($d as $key => $value) {
        if (in_array($key, ['subject', 'price', 'year'])) {
            $out[] = "$key-$value";
        }
        else {
            $out['others'][] = "$key-$value";
        }
    }
    if (isset($out['others'])) $out[] = implode('-', $out['others']);
    unset($out['others']);
    echo "$k : " . implode(' / ', $out) . "\n";
}

输出:

0 : subject-math / price-5 / year-2006
1 : subject-reading / price-7 / year-2007 / author-Smith-publisher-Press 
2 : subject-reading / price-9 / year-2008 / author-Jones-copyright-1999

Demo on 3v4l.org

答案 1 :(得分:1)

我想这将是最简单的实现:

foreach ($array as $index => $item)
{
    $result = array_filter
    ([
        'subject-' . array_shift($item),
        'price-'   . array_shift($item),
        'subject-' . array_shift($item),

        implode('-', $item)
    ]);

    $result = implode(' / ', $result);

    echo "$index: $result\n";
}