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

时间:2016-08-26 07:54:53

标签: php arrays explode

我试图在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
)

我不确定如何在爆炸值之间轻松切换。

感谢。

4 个答案:

答案 0 :(得分:1)

你根本没有使用重复计数。使用简单的方法实现这一点很棘手,并且在有更简单的方法时可能没有必要。

<?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定义构建一次数组。第二个只是合并第一个结果,直到达到数量,然后停止并返回正确数量的项目。

以上输出:

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提供的定义不会产生非空数组时可能出现的无限循环。

答案 1 :(得分:0)

有一种更好的方法可以在PHP中执行字符串到数组。

您可以使用serialize和unserialize或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);

答案 2 :(得分:0)

<?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>';

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

答案 3 :(得分:0)

此处不进入微基准测试,但您可能还需要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)));

减少阵列处理并且可能更快。

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