我有一个名为
$stat
的数组,如下所示:
Array
(
[0] => OK MPD 0.23.5
[1] => repeat: 0
[2] => random: 0
[3] => single: 0
[4] => consume: 1
[5] => partition: default
[6] => playlist: 11292
[7] => playlistlength: 1
[8] => mixrampdb: 0
[9] => state: play
[10] => song: 0
[11] => songid: 3
[12] => time: 14992:0
[13] => elapsed: 14992.067
[14] => bitrate: 48
[15] => audio: 44100:16:2
[16] => OK
)
我希望能够使用数组值(“:”之前)作为变量,而不是数字键。
我需要这样做,因为返回的数组键根据播放器模式而变化。
我尝试了各种方法,但我感觉我对 PHP 的了解还不足以找到解决方案。
我得到的最接近的是:
foreach($stat as $list) {
$list = trim($list);
// echo "$list,";
$list = "{$list}\n";
$list = str_replace(": ", ",", $list);
$xyz = explode(',', $list);
$a=($xyz['0']);
$b=($xyz['1']);
echo "{$a}={$b}";
}
这给了我这个:
repeat=0
random=0
single=0
consume=1
partition=default
playlist=11642
playlistlength=1
mixrampdb=0
state=play
song=0
songid=3
time=15458:0
elapsed=15458.422
bitrate=50
audio=44100:16:2
如果我尝试在 foreach 循环中使用上述输出创建一个数组,我最终会得到一个多维数组,我似乎无法对其执行任何操作。
不能100%确定我是否明白你想要什么,但也许是这样的:
// Init new empty array
$newStat = [];
foreach ($stat as $value) {
$value = trim($value);
// It is not really necessary to replace this, but I kept it as is
$value = str_replace(": ", ",", $value);
$split = explode(',', $value);
$key = $split[0];
$newValue = $split[1];
// Add to empty array
$newStat[$key] = $newValue;
}
echo $newStat['time']; // 15458:0
// You can also do
foreach ($newStat as $key => $value) {
// Whatever you want
}
function parseArray(array $array): array
{
foreach($array as $value) {
// IF the value is s string otherwise no cant do...
if(is_string($value)) {
// If we have a value after : otherwise set to null
if(! str_contains($value, ':')) {
$new[$value] = null;
continue;
}
// Get data before ":" token as key and value after it.
$key = substr($value, 0, strpos($value, ':'));
$value = trim(str_replace($key.':', '', $value));
$new[trim($key)] = $value;
}
}
return $new ?? [];
}
重点关注直接编程,循环
preg_match()
调用将简洁地限定和提取数据,以用作结果数组中的键值对。
该模式捕获一个或多个非冒号字符,然后匹配定界冒号和空格,然后捕获零个或多个字符,直到字符串末尾。
代码:(演示)
$result = [];
foreach ($array as $v) {
if (preg_match('/([^:]+): (.*)/', $v, $m)) {
$result[$m[1]] = $m[2];
}
}
var_export($result);
类似地,
sscanf()
也可用于解析限定值。 请注意,%s
将在空白字符之前停止其贪婪匹配。 演示
$result = [];
foreach ($array as $v) {
if (sscanf($v, '%[^:]:%s', $k, $v) === 2) {
$result[$k] = $v;
}
}
var_export($result);
作为一种时髦的单行替代方案,您可以过滤数组(以删除不带分号的值),用
=
替换分隔冒号空间,用换行符进行内爆,然后将字符串类型有效负载解析为一个 ini 字符串。然而,这要求您的字符串不包含换行符或等于符号。 (演示)
var_export(
parse_ini_string(
implode(
"\n",
preg_filter('/^[^:]+\K: /', '=', $array)
)
)
);