将 foreach 结果拆分为可重用的变量

Split foreach results into reusable variables

我有一个 foreach 函数:

foreach ($result as $result) {
  echo "<a href='" . $result . "'>" . $result . "</a><br>";
}

生成如下列表:

[spacer]_[timespacer]_fiveseconds.wav
[trudy]_[0x06DDD12A]_i.wav
[trudy]_[0x06DDD12A]_get.wav
[spacer]_[timespacer]_halfsecond.wav
[spacer]_[timespacer]_onesecond.wav

我尝试了 explodesplit 函数,但是这个函数总是 returns 整个列表:

array
array

我想要实现的是 foreach $result 一个变量,它在第一组 [] 和另一个变量之间保存 word/name 第二组 [] 然后是第三个变量,它包含最后一个 _.wav 之间的所有内容。所以它会有这些变量:

$result_classname = spacer
$result_parent = timespacer
$result_name = fiveseconds
$result = [spacer]_[timespacer]_fiveseconds.wav

我可以这样做:

foreach ($result as $result) {
  echo "<a class='" . $result_classname . "' href='" . $result . "'>" . $result_name . "</a><span>" . $result_parent . "</span><br>";
}

我怎样才能做到这一点?

首先,您不想在 foreach:

中使用相同的变量
foreach ($result as $result) {

使用不同的变量:

foreach ($result as $value) {

那么,这里有一个非正则表达式的方法来处理这个问题:

list($classname, $parent, $name) = explode('_', $value);
$classname = trim($classname, '[]');
$parent    = trim($parent, '[]');
$name      = pathinfo($name, PATHINFO_FILENAME);
  • 下划线爆炸
  • trim [] 从每一端开始的字符
  • 获取不带扩展名的文件名

或者一个简单的正则表达式:

preg_match('/\[([^\]]+)\]_\[([^\]]+)\]_([^.]+).*/', $value, $matches);

然后用print_r($matches);看看用哪个($matches[0]等)。