我有一个无数的多维数组
/* This is how my array is currently */
Array
(
[0] => Array
(
[0] => Array
(
[plan] => basic
)
[1] => Array
(
[plan] => small
)
[2] => Array
(
[plan] => novice
)
[3] => Array
(
[plan] => professional
)
[4] => Array
(
[plan] => master
)
[5] => Array
(
[plan] => promo
)
[6] => Array
(
[plan] => newplan
)
)
)
我想将此数组转换为此格式
/*Now, I want to simply it down to this*/
Array (
[0] => basic
[1] => small
[2] => novice
[3] => professional
[4] => master
[5] => promo
[6] => newplan
)
知道怎么做吗?
答案 0 :(得分:81)
假设这个数组可能会或可能不会被冗余嵌套,并且你不确定它有多深,那么这应该为你扁平化:
function array_flatten($array) {
if (!is_array($array)) {
return FALSE;
}
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$result = array_merge($result, array_flatten($value));
}
else {
$result[$key] = $value;
}
}
return $result;
}
答案 1 :(得分:66)
$array = array_column($array, 'plan');
第一个参数是数组|第二个参数是数组键。
注意: array_column 是在 PHP 5.5 中引入的,因此在早期版本中不起作用。
答案 2 :(得分:12)
只需将它分配给它自己的第一个元素:
$array = $array[0];
答案 3 :(得分:7)
$singleArray = array();
foreach ($multiDimensionalArray as $key => $value){
$singleArray[$key] = $value['plan'];
}
这是从multiDimensionalArray数组创建数组的最佳方法。
感谢
答案 4 :(得分:5)
对于这种特殊情况,这样做:
$array = array_map('current', $array[0]);
这个基本上是完全相同的问题,请看一些答案:PHP array merge from unknown number of parameters。
答案 5 :(得分:4)
如果遇到纯数据的多维数组(如以下所示),则可以使用一次调用array_merge()来通过反射完成工作:
$arrayMult = [ ['a','b'] , ['c', 'd'] ];
$arraySingle = call_user_func_array('array_merge', $arrayMult);
// $arraySingle is now = ['a','b', 'c', 'd'];
答案 6 :(得分:2)
你可以只使用一个循环。
$singleArray = array();
foreach ($multiDimensionalArray as $key => $value){
$singleArray[$key] = $value['plan'];
}
答案 7 :(得分:2)
最近我一直在使用AlienWebguy的array_flatten功能,但它给了我一个很难找到原因的问题。
array_merge会导致问题,这也不是我第一次遇到问题。
如果在一个内部数组中具有与另一个内部数组中相同的数组键,则后面的值将覆盖合并数组中的先前数组。
这里是不使用array_merge的不同版本的array_flatten:
function array_flatten($array) {
if (!is_array($array)) {
return FALSE;
}
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$arrayList=array_flatten($value);
foreach ($arrayList as $listItem) {
$result[] = $listItem;
}
}
else {
$result[$key] = $value;
}
}
return $result;
}
答案 8 :(得分:1)
问题数组:
array:2 [▼
0 => array:3 [▼
0 => array:4 [▼
"id" => 8
"name" => "Veggie Burger"
"image" => ""
"Category_type" => "product"
]
1 => array:4 [▼
"id" => 9
"name" => "Veggie Pitta"
"image" => ""
"Category_type" => "product"
]
2 => array:4 [▼
"id" => 10
"name" => "Veggie Wrap"
"image" => ""
"Category_type" => "product"
]
]
1 => array:2 [▼
0 => array:4 [▼
"id" => 18
"name" => "Cans 330ml"
"image" => ""
"Category_type" => "product"
]
1 => array:4 [▼
"id" => 19
"name" => "Bottles 1.5 Ltr"
"image" => ""
"Category_type" => "product"
]
]
]
解决方案数组:
array:5 [▼
0 => array:4 [▼
"id" => 8
"name" => "Veggie Burger"
"image" => ""
"Category_type" => "product"
]
1 => array:4 [▼
"id" => 9
"name" => "Veggie Pitta"
"image" => ""
"Category_type" => "product"
]
2 => array:4 [▼
"id" => 10
"name" => "Veggie Wrap"
"image" => ""
"Category_type" => "product"
]
3 => array:4 [▼
"id" => 18
"name" => "Cans 330ml"
"image" => ""
"Category_type" => "product"
]
4 => array:4 [▼
"id" => 19
"name" => "Bottles 1.5 Ltr"
"image" => ""
"Category_type" => "product"
]
]
编写此代码并获取解决方案,$subcate
是您的多维数组。
$singleArrayForCategory = array_reduce($subcate, 'array_merge', array());
答案 9 :(得分:1)
您的样本数组具有3个级别。由于第一级只有[0]
,因此您可以对访问进行硬编码,避免额外的函数/构造调用。
array_walk_recursive()方便且用途广泛,但对于此任务而言可能会过分杀伤力,并且在可读性方面肯定会更加复杂。
array_walk_recursive($array, function($leafvalue)use(&$flat){$flat[] = $leafvalue;});
var_export($flat);
如果这是我的代码,我将使用 array_column(),因为它是直接的,并且从字面上讲正在执行的操作。
var_export(array_column($array[0], 'plan'));
当然,几个foreach()循环将非常高效地执行,因为语言构造通常比函数调用更有效。
foreach ($array[0] as $plans) {
foreach ($plans as $value) {
$flat[] = $value;
}
}
var_export($flat);
最后,作为一种时髦的选择(除非我为不关心的人编写代码,否则我无法想象它会真正使用),我将提供一个 array_merge_recursive()调用与splat运算符(...
)
var_export(array_merge_recursive(...$array[0])['plan']);
答案 10 :(得分:1)
尽管array_column
在这里可以很好地工作,但是如果您需要对任何数组进行 flatten ,无论其内部结构如何,都可以使用此array library轻松实现:
$flattened = Arr::flatten($array);
这将精确地生成您想要的数组。
答案 11 :(得分:0)
您可以使用的简单代码
$array = array_column($array, 'value', 'key');
答案 12 :(得分:0)
我遇到过相同的要求,即将多维数组转换为一维数组,而不是使用键中的文本搜索值。这是我的代码
$data = '{
"json_data": [{
"downtime": true,
"pfix": {
"max": 100,
"threshold": 880
},
"ints": {
"int": [{
"rle": "pri",
"device": "laptop",
"int": "Ether3",
"ip": "127.0.0.3"
}],
"eth": {
"lan": 57
}
}
},
{
"downtime": false,
"lsi": "987654",
"pfix": {
"min": 10000,
"threshold": 890
},
"mana": {
"mode": "NONE"
},
"ints": {
"int": [{
"rle": "sre",
"device": "desk",
"int": "Ten",
"ip": "1.1.1.1",
"UF": true
}],
"ethernet": {
"lan": 2
}
}
}
]
}
';
$data = json_decode($data,true);
$stack = &$data;
$separator = '.';
$toc = array();
while ($stack) {
list($key, $value) = each($stack);
unset($stack[$key]);
if (is_array($value)) {
$build = array($key => ''); # numbering without a title.
foreach ($value as $subKey => $node)
$build[$key . $separator . $subKey] = $node;
$stack = $build + $stack;
continue;
}
if(!is_numeric($key)){
$toc[$key] = $value;
}
}
echo '<pre/>';
print_r($toc);
我的输出:
Array
(
[json_data] =>
[json_data.0] =>
[json_data.0.downtime] => 1
[json_data.0.pfix] =>
[json_data.0.pfix.max] => 100
[json_data.0.pfix.threshold] => 880
[json_data.0.ints] =>
[json_data.0.ints.int] =>
[json_data.0.ints.int.0] =>
[json_data.0.ints.int.0.rle] => pri
[json_data.0.ints.int.0.device] => laptop
[json_data.0.ints.int.0.int] => Ether3
[json_data.0.ints.int.0.ip] => 127.0.0.3
[json_data.0.ints.eth] =>
[json_data.0.ints.eth.lan] => 57
[json_data.1] =>
[json_data.1.downtime] =>
[json_data.1.lsi] => 987654
[json_data.1.pfix] =>
[json_data.1.pfix.min] => 10000
[json_data.1.pfix.threshold] => 890
[json_data.1.mana] =>
[json_data.1.mana.mode] => NONE
[json_data.1.ints] =>
[json_data.1.ints.int] =>
[json_data.1.ints.int.0] =>
[json_data.1.ints.int.0.rle] => sre
[json_data.1.ints.int.0.device] => desk
[json_data.1.ints.int.0.int] => Ten
[json_data.1.ints.int.0.ip] => 1.1.1.1
[json_data.1.ints.int.0.UF] => 1
[json_data.1.ints.ethernet] =>
[json_data.1.ints.ethernet.lan] => 2
)
答案 13 :(得分:0)
如果有多个级别的嵌套数组,没有答案可以帮助我。该解决方案与@AlienWebguy已经完成的解决方案几乎相同,但是差别很小。
function nestedToSingle(array $array)
{
$singleDimArray = [];
foreach ($array as $item) {
if (is_array($item)) {
$singleDimArray = array_merge($singleDimArray, nestedToSingle($item));
} else {
$singleDimArray[] = $item;
}
}
return $singleDimArray;
}
测试示例
$array = [
'first',
'second',
[
'third',
'fourth',
],
'fifth',
[
'sixth',
[
'seventh',
'eighth',
[
'ninth',
[
[
'tenth'
]
]
],
'eleventh'
]
],
'twelfth'
];
$array = nestedToSingle($array);
print_r($array);
//output
array:12 [
0 => "first"
1 => "second"
2 => "third"
3 => "fourth"
4 => "fifth"
5 => "sixth"
6 => "seventh"
7 => "eighth"
8 => "ninth"
9 => "tenth"
10 => "eleventh"
11 => "twelfth"
]
答案 14 :(得分:0)
我已经为接受的答案写了补充。如果像我这样的人需要键的前缀版本,这会有所帮助。
Array
(
[root] => Array
(
[url] => http://localhost/misc/markia
)
)
Array
(
[root.url] => http://localhost/misc/markia
)
<?php
function flattenOptions($array, $old = '') {
if (!is_array($array)) {
return FALSE;
}
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$result = array_merge($result, flattenOptions($value, $key));
}
else {
$result[$old . '.' . $key] = $value;
}
}
return $result;
}
答案 15 :(得分:0)
遵循此模式
$input = array(10, 20, array(30, 40), array('key1' => '50', 'key2'=>array(60), 70));
调用函数:
echo "<pre>";print_r(flatten_array($input, $output=null));
函数声明:
function flatten_array($input, $output=null) {
if($input == null) return null;
if($output == null) $output = array();
foreach($input as $value) {
if(is_array($value)) {
$output = flatten_array($value, $output);
} else {
array_push($output, $value);
}
}
return $output;
}
答案 16 :(得分:0)
具有一个行代码的多维数组到单个数组!!! 享受代码。
$array=[1=>[2,5=>[4,2],[7,8=>[3,6]],5],4];
$arr=[];
array_walk_recursive($array, function($k){global $arr; $arr[]=$k;});
print_r($arr);
...享受代码。
答案 17 :(得分:0)
我用OOP风格完成了这个
$res=[1=>[2,3,7,8,19],3=>[4,12],2=>[5,9],5=>6,7=>[10,13],10=>[11,18],8=>[14,20],12=>15,6=>[16,17]];
class MultiToSingle{
public $result=[];
public function __construct($array){
if(!is_array($array)){
echo "Give a array";
}
foreach($array as $key => $value){
if(is_array($value)){
for($i=0;$i<count($value);$i++){
$this->result[]=$value[$i];
}
}else{
$this->result[]=$value;
}
}
}
}
$obj= new MultiToSingle($res);
$array=$obj->result;
print_r($array);
答案 18 :(得分:-1)
尝试一下对我有用:
$newArray = array();
foreach($operator_call_logs as $array) {
foreach($array as $k=>$v) {
$newArray[$k] = $v;
}
}
答案 19 :(得分:-1)
$flattenArray = [];
foreach ($parentArray as $childArray) {
foreach ($childArray as $value) {
$flattenArray[] = $value;
}
}
答案 20 :(得分:-2)
将其另存为php文件,只需导入并使用single_array()函数
<?php
$GLOBALS['single_array']=[];
function array_conveter($array_list){
if(is_array($array_list)){
foreach($array_list as $array_ele){
if(is_array($array_ele)){
array_conveter($array_ele);
}else{
array_push($GLOBALS['single_array'],$array_ele);
}
}
}else{
array_push($GLOBALS['single_array'],$array_list);
}
}
function single_array($mix){
foreach($mix as $single){
array_conveter($single);
}return $GLOBALS['single_array'];
$GLOBALS['single_array']=[];
}
/* Example convert your multi array to single */
$mix_array=[3,4,5,[4,6,6,7],'abc'];
print_r(single_array($mix_array));
?>