将多维数组转换为单个数组

时间:2011-07-22 03:30:50

标签: php arrays

我有一个无数的多维数组

/* 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
)

知道怎么做吗?

21 个答案:

答案 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],因此您可以对访问进行硬编码,避免额外的函数/构造调用。

Code Demos

  1. array_walk_recursive()方便且用途广泛,但对于此任务而言可能会过分杀伤力,并且在可读性方面肯定会更加复杂。

    array_walk_recursive($array, function($leafvalue)use(&$flat){$flat[] = $leafvalue;});
    var_export($flat);
    
  2. 如果这是我的代码,我将使用 array_column(),因为它是直接的,并且从字面上讲正在执行的操作。

    var_export(array_column($array[0], 'plan'));
    
  3. 当然,几个foreach()循环将非常高效地执行,因为语言构造通常比函数调用更有效。

    foreach ($array[0] as $plans) {
        foreach ($plans as $value) {
            $flat[] = $value;
        }
    }
    var_export($flat);
    
  4. 最后,作为一种时髦的选择(除非我为不关心的人编写代码,否则我无法想象它会真正使用),我将提供一个 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));

?>