Eric Lee Eric Lee - 7 months ago 12
PHP Question

PHP how to make complex large array simple

Hi I'd like to make complex array simple to use in view.

However, I'm kind of stuck making a loop

Please see what i misunderstand about array

I want this array simple

'collection' => [
(int) 0 => [
'type' => 'col',
'name' => '2016 F/W',
'url' => 'blablabla'
],
(int) 1 => [
'type' => 'col',
'name' => '2015 F/W',
'url' => 'blablabla'
],
(int) 2 => [
'type' => 'project',
'name' => '2015 F/W',
'url' => 'blablabla'
]
]


and I want this array like this

[
(int) 0 => [
'type' => 'col',
'type2' => [
(int) 0 => [
'name' => '2016 F/W',
'image' => [
(int) 0 => [
'url' => null
],
(int) 1 => [
'url' => null
]
]
],
(int) 1 => [
'name' => '2015 F/W',
'image' => [
(int) 0 => [
'url' => null
]
]
]
]
],
(int) 1 => [
'type' => 'project',
'type2' => [
(int) 0 => [
'name' => '2015 F/W',
'image' => [
(int) 0 => [
'url' => null
]
]
],
]
]


Please Help!! I'm almost going crazy!!!!

Answer

I got to say that the result array doesn't look very useful. Since there's not much info about the objectives of this task I'll just provide my take on how it can be done..

    $arr = array(
        'collection' => array(
            array(
                'type' => 'col',
                'name' => '2016 fw',
                'url' => 'blabla1'
            ),
            array(
                'type' => 'col',
                'name' => '2015 F/W',
                'url' => 'blabla2'
            ),
            array(
                'type' => 'project',
                'name' => '2015 F/W',
                'url' => 'blabla_project'
            ),

        ),
    );

    // $types array will hold a list of all types. type in this 
    // example is 'col' and 'project'. 
    // we will use $types to find if type X was already added to the 
    // result array.
    $types = array();

    // Every type X will be in the result array in key K, So $typesMap
    // will map between the type to the key in the result array.
    // Example: type X is located in the result array under key K
    // So I can find the type X data by looking at the 
    // $resultArr[K]
    $typesMap = array();
    $typeIndx = 0;

    // This is the result array.
    $resultArr = array();

    // run over all collections
    foreach($arr['collection'] as $collection){

        // get the current type. e.g 'col'
        $type = $collection['type'];

        // Search the $types array for 'col' to see if it was defined
        // already.
        if(!in_array($type, $types)) {
            // if it wasn't defined then define it now:

            // add it to the $types array so that we can find it on
            // the next run.
            $types[] = $type;

            // define the key (K) that it will be in the $resultArr
            $typesMap[$type] = $typeIndx;

            // Create the 'col' key in the result array.
            $resultArr[$typeIndx] = array('type' => $type, 'type2' => array());
            $typeIndx++;
        }

        // get the key for type $type.
        // remember? I can use the $typesMap to find the type's index
        // in the result array.
        $currentIndx = $typesMap[$type];

        // add the extra data to the 'type2' (not a very good name for
        // this)
        $resultArr[$currentIndx]['type2'][] = array(
            'name' => $collection['name'],
            'image' => $collection['url']
        );

    }

I didn't really understand the url part of the result array..