Convert multidimensional array into single array

后端 未结 20 1564
时光取名叫无心
时光取名叫无心 2020-11-22 10:39

I have an array which is multidimensional for no reason

/* This is how my array is currently */
Array
(
[0] => Array
    (
        [0] => Array
                


        
相关标签:
20条回答
  • 2020-11-22 11:22

    You can do it just using a loop.

        $singleArray = array();
    
        foreach ($multiDimensionalArray as $key => $value){
            $singleArray[$key] = $value['plan'];
        }
    
    0 讨论(0)
  • 2020-11-22 11:23

    Your sample array has 3 levels. Because the first level has only [0], you can hardcode your access into it and avoid an extra function/construct call.

    (Code Demos)

    1. array_walk_recursive() is handy and versatile, but for this task may be overkill and certainly a bit more convoluted in terms of readability.

      array_walk_recursive($array, function($leafvalue)use(&$flat){$flat[] = $leafvalue;});
      var_export($flat);
      
    2. If this was my code, I'd be using array_column() because it is direct and speaks literally about the action being performed.

      var_export(array_column($array[0], 'plan'));
      
    3. Of course a couple of `foreach() loops will perform very efficiently because language constructs generally perform more efficiently than function calls.

      foreach ($array[0] as $plans) {
          foreach ($plans as $value) {
              $flat[] = $value;
          }
      }
      var_export($flat);
      
    4. Finally, as a funky alternative (which I can't imagine actually putting to use unless I was writing code for someone whom I didn't care for) I'll offer an array_merge_recursive() call with a splat operator (...).

      var_export(array_merge_recursive(...$array[0])['plan']);
      
    0 讨论(0)
  • 2020-11-22 11:23

    Problem array:

    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"
        ]
      ]
    ]
    

    Solution array:

    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"
      ]
    ]
    

    Write this code and get your solution , $subcate is your multi dimensional array.

    $singleArrayForCategory = array_reduce($subcate, 'array_merge', array());
    
    0 讨论(0)
  • 2020-11-22 11:23

    I have done this with OOP style

    $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);
    
    0 讨论(0)
  • 2020-11-22 11:23

    Save this as a php file, simply import and use single_array() function

    <?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));
    
    ?>
    
    0 讨论(0)
  • 2020-11-22 11:27

    I had come across the same requirement to flatter multidimensional array into single dimensional array than search value using text in key. here is my code

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

    My output:

    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
    )
    
    0 讨论(0)
提交回复
热议问题