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

Posted

技术标签:

【中文标题】将多维数组转换为单个数组【英文标题】:Convert multidimensional array into single array 【发布时间】:2011-07-22 03:30:49 【问题描述】:

我有一个无缘无故的多维数组

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

知道怎么做吗?

【问题讨论】:

无缘无故就这样了?有没有办法一开始就简单地以不同的方式创建数组,而不是更改数组? 【参考方案1】:

这一行就可以做到这一点:

$array = array_column($array, 'plan');

第一个参数是一个数组 |第二个参数是一个数组键。

详情请查看官方文档:https://www.php.net/manual/en/function.array-column.php

【讨论】:

不错,但需要 php 5 >= 5.5.0:php.net/manual/en/function.array-column.php 它仅在您需要特定键的值时有用 @devnull-Ψ 这就是他在问题中提出的问题。【参考方案2】:

假设这个数组可能会或可能不会冗余嵌套,并且您不确定它有多深,这应该为您展平:

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; 
 

【讨论】:

【参考方案3】:

如果您遇到一个纯数据的多维数组,如下面的这个,那么您可以使用一次对 array_merge() 的调用通过反射来完成这项工作:

$arrayMult = [ ['a','b'] , ['c', 'd'] ];
$arraySingle = call_user_func_array('array_merge', $arrayMult);
// $arraySingle is now = ['a','b', 'c', 'd'];

【讨论】:

为我工作。谢谢。 如果有人需要了解更多关于“call_user_func_array”的信息,这里是文档链接:php.net/manual/en/function.call-user-func-array.php 你可以用$arraySingle = array_merge(...$arrayMult);做到这一点 @Peacefull 我看到您以正确的方式使用 PHPStorm!【参考方案4】:

只需将其分配给它自己的第一个元素:

$array = $array[0];

【讨论】:

@Usman Ahmed 再次查看原始数组。所有七个元素都在一个只有一个元素的数组中。 这将输出: Array ( [0] => Array ( [plan] => basic ) [1] => Array ( [plan] => small ) [2] => Array ( [ plan] => 新手 ) ) 这不是他想要的。 它将返回以下数组,这不是用户想要的。 编辑时间@Paul 这个答案根本不正确。【参考方案5】:

对于这种特殊情况,可以这样做:

$array = array_map('current', $array[0]);

这个问题基本上和这个问题一模一样,看看那里的一些答案:PHP array merge from unknown number of parameters。

【讨论】:

它不仅适用于数组'0'元素,也适用于任何数组。谢谢,它的工作原理兄弟@deceze【参考方案6】:
 $singleArray = array();

    foreach ($multiDimensionalArray as $key => $value)
        $singleArray[$key] = $value['plan'];
    

这是从 multiDimensionalArray 数组创建数组的最佳方式。

谢谢

【讨论】:

【参考方案7】:

如果我有多个级别的嵌套数组,没有一个答案对我有帮助。该解决方案与@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"
   ]

【讨论】:

【参考方案8】:

问题数组:

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】:

你可以使用循环来做到这一点。

    $singleArray = array();

    foreach ($multiDimensionalArray as $key => $value)
        $singleArray[$key] = $value['plan'];
    

【讨论】:

【参考方案10】:

您的示例数组有 3 个级别。因为第一级只有[0],所以您可以硬编码您的访问权限并避免额外的函数/构造调用。

(Code Demos)

    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);
    

    最后,作为一个时髦的替代方案(我无法想象实际使用它,除非我正在为我不关心的人编写代码)我将提供一个带有 splat 的 array_merge_recursive() 调用运营商 (...)。

    var_export(array_merge_recursive(...$array[0])['plan']);
    

【讨论】:

【参考方案11】:

尽管array_column 在这里可以很好地工作,但如果您需要展平任何数组,无论其内部结构如何,您都可以使用array library 轻松实现它:

$flattened = Arr::flatten($array);

这将产生你想要的数组。

【讨论】:

这个答案是 Laravel 特有的。我们在 laravel 中有 array_flatten 辅助函数或上面提到的使用宏的方法。【参考方案12】:

最近我一直在使用 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; 
 

【讨论】:

【参考方案13】:

这个你可以使用的简单代码

$array = array_column($array, 'value', 'key');

【讨论】:

【参考方案14】:

遵循这个模式

$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;

【讨论】:

【参考方案15】:

我已经为接受的答案写了一个补充。如果像我这样的人需要密钥的前缀版本,这可能会有所帮助。

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;

【讨论】:

【参考方案16】:

我遇到了相同的要求,即将多维数组扁平化为一维数组,而不是使用键中的文本搜索值。这是我的代码

$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
)

【讨论】:

【参考方案17】:

这是我的贡献

function arrayUnica($array, $prefix = "")

    if (!is_array($array)) 
        return false;
    
    $new_array = [];
    foreach ($array as $key => $value) 
        if (is_array($value)) 
            $key = is_int($key) ? $prefix . $key . "-" : $key . "_";
            $new_array = array_merge($new_array, arrayUnica($value, $key));
         else 
            $new_array[$prefix . $key] = $value;
        
    
    return $new_array;

【讨论】:

【参考方案18】:

我已经用 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);

【讨论】:

【参考方案19】:

一行代码从多维数组到单个数组!!! 享受代码。

$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);

...享受代码。

【讨论】:

【参考方案20】:

试试这个对我有用:

    $newArray = array();
            foreach($operator_call_logs as $array) 
                foreach($array as $k=>$v) 
                    $newArray[$k] = $v;
                
            

【讨论】:

你能在你的代码中添加一些解释吗? $operator_call_logs 包含什么?【参考方案21】:

将此保存为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));

?>

【讨论】:

以上是关于将多维数组转换为单个数组的主要内容,如果未能解决你的问题,请参考以下文章

将平面数组转换为分层的多维数组

将多维数组转换为一维数组的算法

PHP:将多维数组转换为简单数组

如何将数组列表转换为多维数组

ruby 将多维数组转换为一个数组

多维数组指向多维数组