如何从 PHP 中的字符串构建动态数组?

How can I build a dynamic array from a string in PHP?

我正在尝试在 PHP 中创建一个数组,该数组具有由字符串定义的结构。它将循环并使用第一个值作为值,第二个值作为数量。例如,1|3 的值为 1、3 次,然后循环到字符串中的下一个。

这是我目前所拥有的 -

<?php

$quantity = 10;
$string = '1|3,2|3';
$overall_types = array( );

$types = explode( ',', $string );

for ( $i = 1; $i <= $quantity; $i++ )
{
  $qc = explode( '|', $types[0] );
  $overall_types[$i] = $qc[0];
}

echo '<pre>';
print_r ( $overall_types );
echo '</pre>';

这让我感动

Array
(
    [1] => 1
    [2] => 1
    [3] => 1
    [4] => 1
    [5] => 1
    [6] => 1
    [7] => 1
    [8] => 1
    [9] => 1
    [10] => 1
)

但是,我希望结果是

Array
(
    [1] => 1
    [2] => 1
    [3] => 1
    [4] => 2
    [5] => 2
    [6] => 2
    [7] => 1
    [8] => 1
    [9] => 1
    [10] => 2
)

我不确定如何轻松地在分解值之间切换。

谢谢。

据我所知,您根本没有使用重复计数。使用直截了当的方法来实现这一点很棘手,如果有更简单的方法可以做到这一点,则可能没有必要。

<?php
function buildReps($string) {
    $array = [];
    $overall_types = array( );
    $types = explode( ',', $string );
    foreach ($types as $type) {
         $qc = explode( '|', $type );
         $array = array_merge($array, array_fill(0, $qc[1], $qc[0]));
    }
    return $array;
}

function buildAllReps($string, $quantity) {
     $array = [];

     while (count($array) < $quantity) {
          $array = array_merge($array, buildReps($string));
     } 
     return array_slice($array, 0, $quantity); 
}

$quantity = 10;
$string = '1|3,2|3';

echo '<pre>';
print_r ( buildAllReps($string, $quantity) );
echo '</pre>';    

第一个函数根据 $string 定义构建一次数组。第二个只是合并第一个的结果,直到达到数量,然后停止并 returns 返回正确数量的项目。

以上输出:

Array
(
    [0] => 1
    [1] => 1
    [2] => 1
    [3] => 2
    [4] => 2
    [5] => 2
    [6] => 1
    [7] => 1
    [8] => 1
    [9] => 2
)

https://eval.in/629556

中的示例

当心如果 $string 提供的定义没有产生非空数组,可能会出现无限循环。

在 PHP.

中有更好的方法将字符串转换为数组

您可以使用序列化和反序列化或 json_encode 和 json_decode 创建字符串,然后将它们转换为数组。这比您想要实现的要好得多,因为这些方法位于 php 核心中,这意味着它们更快。

http://php.net/serialize

http://php.net/manual/ro/function.json-encode.php

从 json 字符串到数组,您需要执行如下操作:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

// extra boolean parameter set to true to return array instead of json object
$array = json_decode($json, true);
<?php
$quantity = 10;
$string = '1|3,2|3';
$overall_types = [];

$types = explode( ',', $string );
for($c = 0; $c < $quantity; $c++) {
foreach ($types as $currentType) {
 $qc = explode( '|', $currentType );
 for ($i = 0; $i < $qc[1]; $i++) {
   $overall_types[] = $qc[0];
 }
}
}

$overall_types = array_slice($overall_types,0,$quantity);

echo '<pre>';
print_r ( $overall_types );
echo '</pre>';

这应该会为您提供所需的输出。

这里不进行微基准测试,但您可能还可以 preg_replace /g \w|\d+, 乘数的完整字符串表示形式,并且在此步骤之后仅 preg_split 将整个字符串放入数组中。像这样:

$string = '1|3,2|3';

print_r(str_split(preg_replace_callback('/(\w)\|(\d+),?/', function($a) {
    return str_repeat($a[1], $a[2]);
}, $string)));

数组处理更少,速度可能更快。

不过,我建议重新考虑初始字符串表示并寻找更好的方法。如果无论如何都需要转换,为什么需要这种格式?