PHP:展平多维数组

PHP:展平多维数组,php,multidimensional-array,Php,Multidimensional Array,我需要在“然后”之前爆炸。很简单 $alttitle = "35:title1,36:title2, 59:title5" $replacetitles = explode(",",$alttitle); for ($i = 0 ; $i < count($replacetitles) ; $i++) { $replacetitle[] = explode(":", $replacetitles[$i]); } $alttitle=“35:title1,36:title2,59:t

我需要在“然后”之前爆炸。很简单

$alttitle = "35:title1,36:title2, 59:title5"
$replacetitles = explode(",",$alttitle);
for ($i = 0 ; $i < count($replacetitles) ; $i++) {
   $replacetitle[] = explode(":", $replacetitles[$i]);
}
$alttitle=“35:title1,36:title2,59:title5”
$replacetitles=分解(“,”,$alttitle);
对于($i=0;$i
这就产生了

数组([0]=>Array([0]=>35[1]=>title1)[1]=>Array([0]=>36[1]=>title2)[2]=>Array([0]=>59[1]=>title5))

…但是数字35,36,59是唯一的,所以我想让它成为阵列的关键


数组([35]=>title1[36]=>title2[59]=>title5)

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

$ar = array();
for ($i = 0; $i < count($replacetitle); $i++) {
    $ar[$replacetitle[$i][0]] = $replacetitle[$i][1];
}
$ar=array();
对于($i=0;$i
只需在循环时设置:

$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]);
}
通过以上步骤,您将以最少的迭代次数创建阵列。

以下是我的观点

$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 );
$alttitle=“35:title1,36:title2,59:title5”;
$entries=preg_split(“/*,*/”,$alttitle);
$flatten=array();
对于($i=0,$l=count($entries);$i<$l;$i++)
{
列表($index,$value)=分解(“:”,$entries[$i]);
$flatted[$index]=$value;
}
打印(扁平化);
编辑 现在进行速度测试vs爆炸/修剪

$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>';
$testData=内爆(“,”,数组填充(1,10000,“a,b,c,d”);
$start=microtime(真);
$entries=explode(“,”,$testData);
$OUTPUT=array();
对于($i=0,$l=count($entries);$i<$l;$i++)
{
$output[]=trim($entries[$i]);
}
echo“爆炸/微调测试:”,(微时间(真)-$start),“秒
”; 未设置($start、$entries、$output); $start=microtime(真); $entries=preg_split(“/*,*/”,$testData); $OUTPUT=array(); 对于($i=0,$l=count($entries);$i<$l;$i++) { $output[]=$entries[$i]; } echo“preg_split test Take:”,(微时间(真)-$start),“秒
”;
这里是另一个可能是过度的选择

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

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

这是重复的吗?通常最好不要对循环表达式中的固定值使用count(或其他函数)。对于($i=0,$t=count($replacetTitle);$i<$t;$i++){这可能是效率最低的解决方案之一。您添加另一个循环来创建您应该首先完成的事情。如果您将
trim
添加到
$tmparr[0]
,这将是IMHO最优雅的解决方案。嘿,对不起,我的回答似乎有点滞后。我如何分割多个正确答案?!:)@EddyR:你不能。选择一个最适合你的答案,这通常是社区选择的。preg_split的性能远不如explode然后trim。你确定吗?试试我做的测试以上已发布。@Peter Bailey:您的代码无法处理输入,例如
32:我的好书,57:海洋的恐怖,92:Hello World
@Peter Bailey:为了保持结果与使用
trim
相同,您应该使用
preg_split(“/\s*,\s*/m”,“$alttitle”)
从技术上讲,如果我想100%模拟trim(),它必须是
“/[\\s\\r\\n\\0\\x0B]*,[\\s\\r\\n\\0\\x0B]*/”
,但我会把这些细节留给EddyR做练习