PHP:展平多维数组

问题描述 投票:0回答:5

我需要通过“,”然后“:”进行爆炸。足够简单...

$alttitle = "35:title1,36:title2, 59:title5"
$replacetitles = explode(",",$alttitle);
for ($i = 0 ; $i < count($replacetitles) ; $i++) {
   $replacetitle[] = explode(":", $replacetitles[$i]);
}

这会产生...

数组 ( [0] => 数组 ( [0] => 35 [1] => 标题 1 ) [1] => 数组 ( [0] => 36 [1] => 标题 2 ) [2] => 数组 ( [0] => 59 [1] => 标题5) )

...但是数字 35,36,59 是唯一的,所以我希望它成为数组的键?

数组 ( [35] => 标题1 [36] => 标题2 [59] => 标题5 )

php multidimensional-array
5个回答
4
投票

只需在循环时设置即可:

$alttitle = "35:title1,36:title2, 59:title5"
$tmptitles = explode(",",$alttitle);

$replacetitle = array();
foreach($tmptitles as $tmptitle) {
   $tmparr = explode(":", trim($tmptitle));
   $replacetitle[intval($tmparr[0])] = trim($tmparr[1]);
}

通过上述操作,您将创建最少迭代次数的数组。


0
投票

这是另一个但可能有点过分的替代方案。

if (!preg_match_all('/([0-9]+)\s*:\s*([^,]+)/', $alttitle, $matches)) {
    //not valid   
}

$array = array_combine($matches[1], $matches[2]);
print_r($array);

0
投票

这是我的看法

$alttitle  = "35:title1,36:title2, 59:title5";

$entries   = preg_split( "/ *, */", $alttitle );
$flattened = array();

for ( $i = 0, $l = count( $entries ); $i < $l; $i++)
{
  list( $index, $value ) = explode( ':', $entries[$i] );
  $flattened[$index] = $value;
}

print_r( $flattened );

编辑

现在进行速度测试与爆炸/修剪

$testData = implode( ',', array_fill( 1, 10000, "a,b, c,  d" ) );

$start = microtime( true );
$entries = explode( ",", $testData );
$ouptput = array();

for ( $i = 0, $l = count( $entries ); $i < $l; $i++ )
{
  $output[] = trim( $entries[$i] );
}
echo "explode/trim test took: ", ( microtime( true ) - $start ), ' seconds<br>';

unset( $start, $entries, $output );

$start = microtime( true );
$entries = preg_split( "/ *, */", $testData );
$ouptput = array();

for ( $i = 0, $l = count( $entries ); $i < $l; $i++ )
{
  $output[] = $entries[$i];
}
echo "preg_split test took: ", ( microtime( true ) - $start ), ' seconds<br>';

0
投票

您可以通过仅爆炸一次来简化过程,然后在 if 循环内调用

sscanf()
%d
会将数值转换为整数并消除有关空格的担忧。

  • 特别提一下:
    %s
    遇到空格时会停止匹配。如果这是一个问题,请使用否定字符类或更改函数。

代码:(演示)

$alttitle = "35:title1,36:title2, 59:title5";

foreach (explode(',',  $alttitle) as $pair) {
    [$id, $result[$id]] = sscanf($pair, '%d:%s');
}
var_export($result);

输出:

array (
  35 => 'title1',
  36 => 'title2',
  59 => 'title5',
)

-2
投票

在您的代码之后,您可以添加以下内容:

$ar = array();
for ($i = 0; $i < count($replacetitle); $i++) {
    $ar[$replacetitle[$i][0]] = $replacetitle[$i][1];
}
© www.soinside.com 2019 - 2024. All rights reserved.