我试图在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
)
我不确定如何在爆炸值之间轻松切换。
感谢。
答案 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 )
请注意$string
提供的定义不会产生非空数组时可能出现的无限循环。
答案 1 :(得分:0)
有一种更好的方法可以在PHP中执行字符串到数组。
您可以使用serialize和unserialize或json_encode和json_decode来创建字符串,然后将它们转换为数组。这比你想要实现的要好得多,因为这些方法都在php核心中,这意味着它们更快。
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)));
减少阵列处理并且可能更快。
但我建议重新考虑初始字符串表示并寻找更好的方法。如果需要转换,为什么需要这种格式?