user1642018
user1642018

Reputation:

How to reverse convert array from one format to another?

i have an array like this.

Array
(
    [0] => Array
        (
            [size] => 197602
            [files] => Array
                (
                    [0] => directory1
                    [1] => file1.jpg
                )

        )

    [1] => Array
        (
            [size] => 274893
            [files] => Array
                (
                    [0] => directory1
                    [1] => file2.jpg
                )

        )

    [2] => Array
        (
            [size] => 41
            [files] => Array
                (
                    [0] => directory2
                    [1] => file1.txt
                )

        )

    [3] => Array
        (
            [size] => 41
            [files] => Array
                (
                    [0] => directory2
                    [1] => file2.txt
                )

        )

    [4] => Array
        (
            [size] => 47
            [files] => Array
                (
                    [0] => directory2
                    [1] => sub-directory1
                    [2] => file1.txt
                )

        )

    [5] => Array
        (
            [size] => 41
            [files] => Array
                (
                    [0] => directory2
                    [1] => sub-directory1
                    [2] => file2.txt
                )

        )

    [6] => Array
        (
            [size] => 47
            [files] => Array
                (
                    [0] => directory2
                    [1] => sub-directory1
                    [2] => file3.txt
                )

        )

    [7] => Array
        (
            [size] => 41
            [files] => Array
                (
                    [0] => file1.txt
                )

        )

    [8] => Array
        (
            [size] => 47
            [files] => Array
                (
                    [0] => file2.txt
                )

        )

)

i used this code snippet.

<?php

foreach($array as $x)
{
    $path=implode('\\',$x['path']);
    $files[$path]=$x['length'];
}

and got simplified version of above array like this.

Array
(
    'directory1\file1.jpg' => 197602,
    'directory1\file2.jpg' => 274893,
    'directory2\file1.txt' => 41,
    'directory2\file2.txt' => 41,
    'directory2\sub-directory1\file1.txt' => 47,
    'directory2\sub-directory1\file2.txt' => 41,
    'directory2\sub-directory1\file3.txt' => 47,
    'file1.txt' => 41,
    'file2.txt' => 47
);

so my question is how can i get the original array from simplified array, i.e. 1st array from 2nd array. ?

so far i have tried this.

<?php

$array =    Array
    (
        'directory1\file1.jpg' => 197602,
        'directory1\file2.jpg' => 274893,
        'directory2\file1.txt' => 41,
        'directory2\file2.txt' => 41,
        'directory2\sub-directory1\file1.txt' => 47,
        'directory2\sub-directory1\file2.txt' => 41,
        'directory2\sub-directory1\file3.txt' => 47,
        'file1.txt' => 41,
        'file2.txt' => 47
    );

    print_r($array);


$new_array = array();

    foreach($array as $path => $size){

        if(strpos($path,'\\') !== false) {
        //file is under a directory tree/structure 

        $directory_tree = explode('\\',$path);

        $new_array[]['size'] = $size ;
        $new_array[]['files'] = $directory_tree;

        //last element in array is filename. 

       //print_r($directory_tree );

        }else{
        //its just file

        $new_array[]['size'] = $size;
        $new_array[]['path']= $path;

        }

   }


    print_r($new_array);

but getting double arrays for size and files like this.

Array
(
    [0] => Array
        (
            [size] => 197602
        )

    [1] => Array
        (
            [files] => Array
                (
                    [0] => directory1
                    [1] => file1.jpg
                )

        )

    [2] => Array
        (
            [size] => 274893
        )

    [3] => Array
        (
            [files] => Array
                (
                    [0] => directory1
                    [1] => file2.jpg
                )

        )

    [4] => Array
        (
            [size] => 41
        )

    [5] => Array
        (
            [files] => Array
                (
                    [0] => directory2
                    [1] => file1.txt
                )

        )

    [6] => Array
        (
            [size] => 41
        )

    [7] => Array
        (
            [files] => Array
                (
                    [0] => directory2
                    [1] => file2.txt
                )

        )

    [8] => Array
        (
            [size] => 47
        )

    [9] => Array
        (
            [files] => Array
                (
                    [0] => directory2
                    [1] => sub-directory1
                    [2] => file1.txt
                )

        )

    [10] => Array
        (
            [size] => 41
        )

    [11] => Array
        (
            [files] => Array
                (
                    [0] => directory2
                    [1] => sub-directory1
                    [2] => file2.txt
                )

        )

    [12] => Array
        (
            [size] => 47
        )

    [13] => Array
        (
            [files] => Array
                (
                    [0] => directory2
                    [1] => sub-directory1
                    [2] => file3.txt
                )

        )

    [14] => Array
        (
            [size] => 41
        )

    [15] => Array
        (
            [path] => file1.txt
        )

    [16] => Array
        (
            [size] => 47
        )

    [17] => Array
        (
            [path] => file2.txt
        )

)

How can i solve this issue ?

thanks

Upvotes: 0

Views: 51

Answers (2)

hindmost
hindmost

Reputation: 7195

You have to change this snippet:

    $new_array[]['size'] = $size ;
    $new_array[]['files'] = $directory_tree;

to this:

    $new_array[] = array('size' => $size, 'files' => $directory_tree);

And similarly for the "just file" case:

    $new_array[] = array('size' => $size, 'path' => $path);

Upvotes: 3

Chibueze Opata
Chibueze Opata

Reputation: 10054

Alternatively, you could create a callback:

function parse($arr)
{
    return explode('\\', $arr);//process your array
}

Then do it in one line:

$original = array_map('parse', $converted);

Upvotes: 0

Related Questions