首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据preg匹配条件合并foreach循环中的值

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

Stack Overflow用户
提问于 2018-12-29 08:09:26
回答 2查看 83关注 0票数 0

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

我的数据在如下所示的数组中:

代码语言:javascript
复制
[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
    )

我的代码是:

代码语言:javascript
复制
$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 />';
        }                       
}

我希望上面代码的输出是:

代码语言:javascript
复制
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条件的名称值对。本质上是主题,价格和年份,每个记录都是通用的,但我希望能够访问的任何其他记录都合并在一起作为一个项目。

提前感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-29 08:34:41

这段代码将执行您想要的操作。它循环遍历您的数组,将所有键-值对推入一个数组中,然后回显该数组的内爆(使用/)。subjectpriceyear的值都有自己的条目,而所有其他值都被推入一个数组中,然后使用-对该数组进行内爆,以提供所需的输出。不是使用preg_match来匹配关键字,而是使用简单的in_array

代码语言:javascript
复制
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";
}

输出:

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2018-12-29 08:46:20

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

代码语言:javascript
复制
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";
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53965605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档