Search code examples
phparraysangularjsassociative-arrayangular-filters

Handling associative array either in php or angular


I have the following array result from my PHP code.

$aa = {
        "1": [
            {
                "ID": "1",
                "IDu": "1",
                "doc_picture": "yes",
                "doc_contract": "no",
                "doc_name": "images201103928128.jpg"
            },
            {
                "ID": "1",
                "IDu": "1",
                "doc_picture": "no",
                "doc_contract": "yes",
                "doc_name": "images20110_doc.jpg"
            },
            {
                "ID": "1",
                "IDu": "1",
                "doc_picture": "yes",
                "doc_contract": "no",
                "doc_name": "28128.jpg"
            },
            {
                "ID": "1",
                "IDu": "1",
                "doc_picture": "yes",
                "doc_contract": "no",
                "doc_name": "i128.jpg"
            }
        ],
        "2": [
            {
                "ID": "2",
                "IDu": "1",
                "doc_picture": "yes",
                "doc_contract": "no",
                "doc_name": "i12fsdf8.jpg"
            },
            {
                "ID": "2",
                "IDu": "1",
                "doc_picture": "yes",
                "doc_contract": "no",
                "doc_name": "i12fffffsdf8.jpg"
            },
            {
                "ID": "2",
                "IDu": "1",
                "doc_picture": "no",
                "doc_contract": "yes",
                "doc_name": "dddf8_doc.jpg"
            }
        ],
        "5": [
            {
                "IDaut": "5",
                "IDusr": "1",
                "doc_picture": null,
                "doc_contract": null,
                "doc_name": null
            }
        ],
        "6": [
            {
                "ID": "6",
                "IDu": "1",
                "doc_picture": "no",
                "doc_contract": "yes",
                "doc_name": "d8_doc.jpg"
            },
            {
                "ID": "6",
                "IDu": "1",
                "doc_picture": "yes",
                "doc_contract": "no",
                "doc_name": "f8.jpg"
            },
            {
                "ID": "6",
                "IDu": "1",
                "doc_picture": "yes",
                "doc_contract": "no",
                "doc_name": "d.jpg"
            },
            {
                "ID": "6",
                "IDu": "1",
                "doc_picture": "no",
                "doc_contract": "yes",
                "doc_name": "gg_doc.jpg"
            }
        ]
    };

As you see the only difference in each associated array is only doc_name.

what i need is like this array to be generated...

$aa = {
        "1": [
            {
                "ID": "1",
                "IDu": "1",
                "doc_name": "images201103928128.jpg_picture",
                "doc_name": "images20110_doc.jpg_document", 
                "doc_name": "28128.jpg_picture", 
                "doc_name": "i128.jpg_picture"
            },
        ],
        "2": [
            {
                "ID": "2",
                "IDu": "1",
                "doc_name": "i12fsdf8.jpg_picture",
                "doc_name": "i12fffffsdf8.jpg_picture",
                "doc_name": "dddf8_doc.jpg_document"
            },
        ],
        "5": [
            {
                "IDaut": "5",
                "IDusr": "1",
                "doc_picture": null,
                "doc_contract": null,
                "doc_name": null
            }
        ],
        "6": [
            {
                "ID": "6",
                "IDu": "1",
                "doc_name": "d8_doc.jpg_document",
                "doc_name": "f8.jpg_picture",
                "doc_name": "d.jpg_picture",
                "doc_name": "gg_doc.jpg_documen"
            },
        ]
    };

Here is the PHP Code...

function get_List($ID)
    {

        $this->db >select('u.ID,u.IDu,d.doc_picture,
                           d.doc_contract,d.doc_name,
                           a.*');
        $this->db->from('t_user u'); 
        $this->db->join('t_doc d', 'd.ID=u.ID', 'left');
        $this->db->where('u.ID',$ID);         

        $query = $this->db->get();
        $result = $query->result_array();

        $group = array();

        foreach($result as $val) {
            $group[$val['ID']][] = $val;
        }
        return $group;
    }

What happened is, I just need to group according to their ID and show all the doc_name tag with its associate document type as you see above.

How could I achieve that? In PHP or Angular filter...what ever solution you suggest I will be very happy...

Thanks in Advance


Solution

  • I would do it like this:

    $newArray = array();
    foreach($aa as $key => $array) {
      $ids = array();
      foreach($array as $elements) {
        $ukey = $elements['ID'].$elements['IDu'];
        if(!isset($ids[$ukey])) $ids[$ukey] = array('ID' => $elements['ID'], 'IDu' => $elements['IDu']);
        $ext = '';
        if($elements['doc_picture'] === 'yes')  $ext = '_picture';
        else if($elements['doc_contract'] === 'yes') $ext = '_document';
        $ids[$ukey]['doc_name'][] = $elements['doc_name'].$ext;
      }
      foreach($ids as $id) {
        if(!isset($newArray[$key])) $newArray[$key] = array();
        array_push($newArray[$key],$id);
      }
    }
    // this will print out what you requested
    print_r($newArray);
    

    Some notes on this:

    • There can't be multiple doc_name keys, since keys have to be unique in arrays. Because of this, doc_name will be an array.
    • With this solution you can have multiple different IDu numbers and it will create a separate array for those (This is the behavior I would expect, since you did not write about that).

    I used the following array for testing (note that I added some more entries so you can see the full behavior):

    $aa = array("1" => array(array("ID" => "1","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "images201103928128.jpg"),
                             array("ID" => "1","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "images20110_doc.jpg"),
                             array("ID" => "1","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "28128.jpg"),
                             array("ID" => "1","IDu" => "2","doc_picture" => "yes","doc_contract" => "no","doc_name" => "4567.jpg"),
                             array("ID" => "1","IDu" => "2","doc_picture" => "no","doc_contract" => "yes","doc_name" => "1234.jpg"),
                             array("ID" => "1","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "i128.jpg")),
                "2" => array(array("ID" => "2","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "i12fsdf8.jpg"),
                             array("ID" => "2","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "i12fffffsdf8.jpg"),
                             array("ID" => "2","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "dddf8_doc.jpg")),
                "5" => array(array("ID" => "5","IDu" => "1","doc_picture" => null,"doc_contract" => null,"doc_name" => null)),
                "6" => array(array("ID" => "6","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "d8_doc.jpg"),
                             array("ID" => "6","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "f8.jpg"),
                             array("ID" => "6","IDu" => "1","doc_picture" => "yes","doc_contract" => "no","doc_name" => "d.jpg"),
                             array("ID" => "6","IDu" => "1","doc_picture" => "no","doc_contract" => "yes","doc_name" => "gg_doc.jpg")));