moses omondi
moses omondi

Reputation: 23

Combine multidimentional array and ignore the array inside

I have a multidimentional array below in php.

   $resultdata[0] = array(
                            "daynumber" =>  15,
                            "dayname"   =>'Tue', 
                            "infomation"    =>  array('baller', 'ROller')
                            );  
    $resultdata[1] = array(
                            "daynumber" =>  15,
                            "dayname"   =>'Tue', 
                            "infomation"    =>  array('nomal', 'Goildt')
                            );  
    $resultdata[2] = array(
                            "daynumber" =>  24,
                            "dayname"   =>'Thur', 
                            "infomation"    =>  array('Volley', 'Foller')
                            );  

I want to combine the similar dates to form the following result.

$resultdata[0] = array(
                        "daynumber" =>  15,
                        "dayname"   =>'Tue', 
                        "infomation"    =>  array('baller', 'ROller'), array('nomal', 'Goildt')
                        );  
$resultdata[1] = array(
                        "daynumber" =>  24,
                        "dayname"   =>'Thur', 
                        "infomation"    =>  array('Volley', 'Foller')
                        );

Thanx in advance

I tried using this code but it requies me to convert array to string which i dont want

function combineAndIgnore($result_arr){
    $arr = array();
    foreach($result_arr as $val){
          $item = $val[$key];     
          foreach($val as $k=>$v){
              $arr[$item][$k][] = $v;
          }
    }

    // Combine unique entries into a single array
    // and non-unique entries into a single element
    foreach($arr as $key=>$val){
        foreach($val as $k=>$v){
            $field = array_unique($v);
            if(count($field) == 1){
                $field = array_values($field);
                $field = $field[0];
                $arr[$key][$k] = $field;
            } else {
                $arr[$key][$k] = $field;
            }
        }
    }
    return $arr;
}

Upvotes: 0

Views: 43

Answers (2)

Poiz
Poiz

Reputation: 7617

Here's a quick-and-dirty solution to your unique use-case which you may as well Quick-T3st here:

<?php

    $strJson    = '[
                        {
                            "daynumber"     :15,
                            "dayname"       :"Tue",
                            "infomation"    :["baller","ROller"]
                        },
                        {
                            "daynumber"     :15,
                            "dayname"       :"Tue",
                            "infomation"        :["nomal","Goildt"]
                        },
                        {
                            "daynumber"     :24,
                            "dayname"       :"Thur",
                            "infomation"    :["Volley","Foller"]
                        }
                    ]';


    function arrayBlend($jsonData){
        $resultData = json_decode($jsonData, true);
        $arrAll     = [];

        foreach($resultData as $data){
            if(is_array($data)){
                $arrAll[]   = $data;
            }
        }

        foreach($arrAll as $iCount=>&$arr){
            $dayNum     = $arr['daynumber'];
            $dayName    = $arr['dayname'];
            $prev       = ($iCount>0) ? $arrAll[$iCount-1] : null;
            if($prev['daynumber'] == $dayNum && $prev['dayname'] == $dayName){
                $arr['infomation'] = [ $prev['infomation'], $arr['infomation']];
                unset($arrAll[$iCount-1]);
            }
        }
        return $arrAll;
    }

    var_dump( arrayBlend($strJson) );

The var_dump() above yieds:

    array:2 [
      1 => array:3 [
        "daynumber" => 15
        "dayname" => "Tue"
        "infomation" => array:2 [
          0 => array:2 [
            0 => "baller"
            1 => "ROller"
          ]
          1 => array:2 [
            0 => "nomal"
            1 => "Goildt"
          ]
        ]
      ]
      2 => array:3 [
        "daynumber" => 24
        "dayname" => "Thur"
        "infomation" => array:2 [
          0 => "Volley"
          1 => "Foller"
        ]
      ]
    ]

Upvotes: 0

moses omondi
moses omondi

Reputation: 23

I gave in to the convert to sting option which has worked anyway

    <?php

    $resultdata[0] = array(
                            "daynumber" =>  15,
                            "dayname"   =>'Tue', 
                            "infomation"    =>  array('baller', 'ROller','','gtk')
                            );  
    $resultdata[1] = array(
                            "daynumber" =>  15,
                            "dayname"   =>'Tue', 
                            "infomation"    =>  array('nomal', 'Goildt')
                            );  
    $resultdata[2] = array(
                            "daynumber" =>  24,
                            "dayname"   =>'Thur', 
                            "infomation"    =>  array('goon'    =>  'Volley', 'Foller')
                            );  

            $counter = 0;
            foreach($resultdata as $veliu){
                $newinfo = implode(':*:', $veliu["infomation"]);
                $veliu["infomation"] = $newinfo;
                $temporryry[$counter] = $veliu;
                $counter++;
            }



    function multiarray_merge($result_arr, $key){

    foreach($result_arr as $val){
        $item = $val[$key];     
        foreach($val as $k=>$v){
            $arr[$item][$k][] = $v;
        }
    }

    // Combine unique entries into a single array
    // and non-unique entries into a single element
    foreach($arr as $key=>$val){
        foreach($val as $k=>$v){
            $field = array_unique($v);
            if(count($field) == 1){
                $field = array_values($field);
                $field = $field[0];
                $arr[$key][$k] = $field;
            } else {
                $arr[$key][$k] = $field;
            }
        }
    }
    return $arr;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <link href="https://fonts.googleapis.com/css?family=Varela+Round" rel="stylesheet">
    <style type="text/stylesheet">
        font-family: 'Varela Round', sans-serif;
    </style>
</head>
<body>
    <pre>
        <?php
            $newarray = multiarray_merge($temporryry, 'daynumber');

            $count = 0;
            $counte = 0;
            foreach($newarray as $vel){
                $notin = $vel["infomation"];
                if(is_array($notin)){
                    foreach($notin as $jin){
                        $reve = explode(":*:", $jin);
                        $good[$counte] = $reve;
                        $counte++;  
                    }
                }else{
                    $reve = explode(":*:", $notin);
                    $good= $reve;
                }
                $vel["infomation"] = $good;
                $finalsolution[$count] = $vel;
                $count++;
            }

            print_r($finalsolution);
        ?>
    </pre>

</body>
</html>

RESULT

            Array
(
    [0] => Array
        (
            [daynumber] => 15
            [dayname] => Tue
            [infomation] => Array
                (
                    [0] => Array
                        (
                            [0] => baller
                            [1] => ROller
                            [2] => 
                            [3] => gtk
                        )

                    [1] => Array
                        (
                            [0] => nomal
                            [1] => Goildt
                        )

                )

        )

    [1] => Array
        (
            [daynumber] => 24
            [dayname] => Thur
            [infomation] => Array
                (
                    [0] => Volley
                    [1] => Foller
                )

        )

)

Upvotes: 1

Related Questions