在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条件的名称值对。从本质上讲,每条记录的主题,价格和年份均相同,但我希望能够访问的所有其他记录都合并为一项。
在此先感谢您的帮助!
答案 0 :(得分:3)
此代码将执行您想要的操作。它遍历数组,将所有键值对推入数组,然后回显该数组的爆破(用/
)。 subject
,price
和year
的值具有其自己的条目,而所有其他值均被推入数组,然后使用-
进行内插以提供所需的输出。与其使用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
答案 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";
}