拆分数组中合格的冒号空格分隔的字符串以形成新的关联数组

问题描述 投票:0回答:3

我有一个名为

$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 循环中使用上述输出创建一个数组,我最终会得到一个多维数组,我似乎无法对其执行任何操作。

php arrays associative-array text-parsing delimited
3个回答
1
投票

不能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
}

0
投票
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 ?? [];
}


0
投票

重点关注直接编程,循环

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)
        )
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.