转换这个单个数组的简单方法是什么:
Array(
[0] => 1.1
[1] => 1.2
[2] => 1.3
[3] => 2.1
[4] => 2.2
[5] => 2.3
[6] => 3.1
[7] => 3.2
)
进入像这样的多维数组:
Array
(
[1] => Array
(
[1] => 1.1
[2] => 1.2
[3] => 1.3
)
[2] => Array
(
[1] => 2.1
[2] => 2.2
[3] => 2.3
)
[3] => Array
(
[1] => 3.1
[2] => 3.2
)
)
行数和列数可以改变(由用户输入),并且单元格的内部与两者的组合相同(如图所示)。
我认为您正在寻找的答案称为 array_chunk()。
<?php
$input_array = Array(
[0] => 1.1
[1] => 1.2
[2] => 1.3
[3] => 2.1
[4] => 2.2
[5] => 2.3
[6] => 3.1
[7] => 3.2
)
print_r(array_chunk($input_array, 3));
?>
输出:
Array
(
[1] => Array
(
[1] => 1.1
[2] => 1.2
[3] => 1.3
)
[2] => Array
(
[1] => 2.1
[2] => 2.2
[3] => 2.3
)
[3] => Array
(
[1] => 3.1
[2] => 3.2
)
)
我会这样做:
<?php
$origArray = array(1.1, 1.2, 1.3, 2.1, 2.2, 2.3, 3.1, 3.2);
$chunkedArray = array_chunk($origArray, 3);
foreach($chunkedArray as $increment => $chunk){
$resultArray[$increment+1] = $chunk;
}
print_r($resultArray);
?>
我会使用数组遍历,只是因为我懒得打字
foreach( ..bla.. ..bla.. )
$array = Array(
'1.1',
'1.2',
'1.3',
'2.1',
'2.2',
'2.3',
'3.1',
'3.2',
);
$res = [];
array_walk( $array, function($item) use (&$res){
$key = substr($item, 0,1); //get the first place, this will work up to # 9
if( isset($res[$key]))
$res[$key][] = $item;
else
$res[$key] = [$item];
});
var_export( $res );
您甚至可以在这里进行测试。
http://sandbox.onlinephpfunctions.com/code/0988bc488a732270589106c0ea7738f36e4a9407
输出
array (
1 =>
array (
0 => '1.1',
1 => '1.2',
2 => '1.3',
),
2 =>
array (
0 => '2.1',
1 => '2.2',
2 => '2.3',
),
3 =>
array (
0 => '3.1',
1 => '3.2',
),
)
我今天感觉很慷慨,但你真的应该自己尝试一下,这是一个小问题。
如果你想超过
9.
那么你需要像这样使用.
找到strpos
的位置
array_walk( $array, function($item) use (&$res){
$key = substr($item, 0, (strpos($item,'.')));
if( isset($res[$key]))
$res[$key][] = $item;
else
$res[$key] = [$item];
});
您可以在这里测试那个(我将第一项更改为
10.1
http://sandbox.onlinephpfunctions.com/code/9a192bf28cd0fb2046e99206a2cf6ac5b2533b3c
$array = array(1.1,1.2,1.3,2.1,2.2,2.3,3.1,3.2);
$input_size = 3;
$newArray = array();
$newArray = array_chunk($array, $input_size);
print_r($newArray);
这可能就是您正在寻找的。您只需使用数组块转换它并分配它。
试试这个:
<?php
$a = [1.1,1.2,1.3,2.1,2.2,2.3,3.1,3.2];
function newArray($array)
{
$b = [];
/* create multidimension array */
foreach($array as $v){
$d = (int)floor($v);
$b[ $d ][] = $v;
}
/* re-index child nodes arrays to start from 1 */
array_walk($b, function(&$item){
$item = array_combine(range(1, count($item)), array_values($item));
});
return $b;
}
$b = newArray($a);
print_r($b);
或者更简单:
<?php
$a = [1.1, 1.2, 1.3, 2.1, 2.2, 2.3, 3.1, 3.2];
function newArray2($array)
{
$b = [];
$i = $j = 1;
/* create multidimension array */
foreach($array as $v){
$i_ = (int)floor($v);
if($i_ != $i){
$j = 1;
$i = $i_;
}
$b[ $i ][ $j ] = $v;
++$j;
}
return $b;
}
$b = newArray2($a);
print_r($b);
你应该使用 array_chunk($array,3):
print_r(array_chunk($input_array, 3));
//$input_array is your array which you have defined above
您可以通过
floor()
来实现它,它将返回四舍五入到最接近的整数,因为这似乎是您所需数组的要求,尝试下面的一个,您不必 chunk
数组,因为您的元素可能会有所不同所以这里没有元素变化依赖的数量,并且 array_chunk()
你想要的数组键以 0 开头,可以用下面的一个来解决:
<?php
$array = array('1.1','1.2','1.3','2.1','2.2','2.3','3.1','3.2');
$newarray = array();
foreach($array as $value){
$newarray[floor($value)][] = $value;
}
echo "<pre>";
print_r($newarray);
在此处检查上述工作示例https://eval.in/842752
我发现从
1
开始数字键的要求相当令人恼火。这使得代码远不那么简洁/优雅。通过在索引 0
处声明第一个元素,然后取消设置它,PHP 将推入的下一个键将是 1
(依此类推)。
代码:(演示)
$result = [null]; // temporary declaration
unset($result[0]); // move pointer to 1 for next push
foreach ($array as $v) {
sscanf($v, '%d', $major);
if (!isset($ref[$major])) {
$result[] = &$ref[$major];
$ref[$major] = [null]; // temporary declaration
unset($ref[$major][0]); // move pointer to 1 for next push
}
$ref[$major][] = $v;
}
var_export($result);
如果索引数组的索引数组令人满意,则可以省略临时元素操作。只需隔离前导整数并使用它对推入结果数组的引用变量进行分组即可。 (演示)
$result = [];
foreach ($array as $v) {
sscanf($v, '%d', $major); // isolate the leading integer
if (!isset($ref[$major])) {
$result[] = &$ref[$major]; // push a reference to the new group into the result array
}
$ref[$major][] = $v; // push the current element into the current reference/group
}
var_export($result);