【问题标题】:How can I use array values as keys?如何使用数组值作为键?
【发布时间】:2022-10-18 13:21:18
【问题描述】:

我有一个名为 $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


    【解决方案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
    }
    

    【讨论】:

      【解决方案2】:
      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 ?? [];
      }
      
      

      【讨论】:

        【解决方案3】:

        专注于直接编程,循环的preg_match() 调用将简明扼要地限定和提取数据,以用作结果数组中的键值对。

        该模式捕获一个或多个非冒号字符,然后匹配定界冒号和空格,然后捕获零个或多个字符,直到字符串结尾。

        代码:(Demo)

        $result = [];
        foreach ($array as $v) {
            if (preg_match('/([^:]+): (.*)/', $v, $m)) {
                $result[$m[1]] = $m[2];
            }
        }
        var_export($result);
        

        作为一种时髦的单行替代方案,您可以过滤数组(以删除不带分号的值),用= 替换定界冒号空间,用换行符替换内爆,然后将字符串类型的有效负载解析为ini 字符串。但是,这要求您的任何字符串都不包含换行符或等号。 (Demo)

        var_export(
            parse_ini_string(
                implode(
                    "
        ",
                    preg_filter('/^[^:]+K: /', '=', $array)
                )
            )
        );
        

        【讨论】:

          猜你喜欢
          • 2019-03-16
          • 2019-11-21
          • 1970-01-01
          • 2018-12-01
          • 2015-03-23
          • 2015-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多