如何从 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
)
中的示例
当心如果 $string
提供的定义没有产生非空数组,可能会出现无限循环。
在 PHP.
中有更好的方法将字符串转换为数组
您可以使用序列化和反序列化或 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);
<?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)));
数组处理更少,速度可能更快。
不过,我建议重新考虑初始字符串表示并寻找更好的方法。如果无论如何都需要转换,为什么需要这种格式?
我正在尝试在 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 )
当心如果 $string
提供的定义没有产生非空数组,可能会出现无限循环。
在 PHP.
中有更好的方法将字符串转换为数组您可以使用序列化和反序列化或 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);
<?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)));
数组处理更少,速度可能更快。
不过,我建议重新考虑初始字符串表示并寻找更好的方法。如果无论如何都需要转换,为什么需要这种格式?