1

I have an array having multiple values for same values for array of same keys

eg.

Array(
   [0] => Array(
                  'name' => "Bob",
                  'age'  => 20,
                  'marks'=> 50
               )
   [1] => Array(
                  'name' => "Ryan",
                  'age'  => 20,
                  'marks'=> 57
               )
   [2] => Array(
                  'name' => "Allen",
                  'age'  => 23,
                  'marks'=> 70
               )
   [3] => Array(
                  'name' => "Duke",
                  'age'  => 23,
                  'marks'=> 67
               )
   [4] => Array(
                  'name' => "Matt",
                  'age'  => 24,
                  'marks'=> 85
               )
)

I want to convert them to according to there age as following using Set::Combine in Cakephp.

Array(
   [20] => Array(
                 [0] => Array(
                             'name' => "Bob",
                             'age'  => 20,
                             'marks'=> 50
                             )
                 [1] => Array(
                             'name' => "Ryan",
                             'age'  => 20,
                             'marks'=> 57
                             )
                )
   [23] => Array(
                 [0] => Array(
                             'name' => "Allen",
                             'age'  => 23,
                             'marks'=> 70
                             )
                 [1] => Array(
                             'name' => "Duke",
                             'age'  => 23,
                             'marks'=> 67
                             )
                )
   [24] => Array(
                 [0] => Array(
                             'name' => "Matt",
                             'age'  => 24,
                             'marks'=> 85
                             )
                )

 )

I'm only able to get one content for a particular age.

1 Answer 1

1

If I understood your question correctly, you can obtain almost what you want using this (tested with CakePHP 3):

Hash::combine($array, '{n}.user', '{n}', '{n}.age') ;

You can then use array_map and array_values to get exactly what you want:

array_map('array_values', Hash::combine($array, '{n}.name', '{n}', '{n}.age'))

Do not forget to add the following use statement: use \Cake\Utility\Hash ;

Edit: It looks like you are using CakePHP 2, the above should work, you simply need to replace Hash by Set:

array_map('array_values', Set::combine($array, '{n}.name', '{n}', '{n}.age'))

Example:

$array = array(
    0 => array(
        'name' => "Bob",
        'age'  => 20,
        'marks'=> 50
    ),
    1 => array(
        'name' => "Ryan",
        'age'  => 20,
        'marks'=> 57
    ),
    2 => array(
        'name' => "Allen",
        'age'  => 23,
        'marks'=> 70
    ),
    3 => array(
        'name' => "Duke",
        'age'  => 23,
        'marks'=> 67
    ),
    4 => array(
        'name' => "Matt",
        'age'  => 24,
        'marks'=> 85
    )
) ;
debug($array);
debug(\Cake\Utility\Hash::combine($array, '{n}.user', '{n}', '{n}.age'));
debug(array_map('array_values', \Cake\Utility\Hash::combine($array, '{n}.name', '{n}', '{n}.age')));

Output:

\src\Controller\PagesController.php (line 61) 

[
    (int) 0 => [
        'name' => 'Bob',
        'age' => (int) 20,
        'marks' => (int) 50
    ],
    (int) 1 => [
        'name' => 'Ryan',
        'age' => (int) 20,
        'marks' => (int) 57
    ],
    (int) 2 => [
        'name' => 'Allen',
        'age' => (int) 23,
        'marks' => (int) 70
    ],
    (int) 3 => [
        'name' => 'Duke',
        'age' => (int) 23,
        'marks' => (int) 67
    ],
    (int) 4 => [
        'name' => 'Matt',
        'age' => (int) 24,
        'marks' => (int) 85
    ]
]


\src\Controller\PagesController.php (line 62) 

[
    (int) 20 => [
        'Bob' => [
            'name' => 'Bob',
            'age' => (int) 20,
            'marks' => (int) 50
        ],
        'Ryan' => [
            'name' => 'Ryan',
            'age' => (int) 20,
            'marks' => (int) 57
        ]
    ],
    (int) 23 => [
        'Allen' => [
            'name' => 'Allen',
            'age' => (int) 23,
            'marks' => (int) 70
        ],
        'Duke' => [
            'name' => 'Duke',
            'age' => (int) 23,
            'marks' => (int) 67
        ]
    ],
    (int) 24 => [
        'Matt' => [
            'name' => 'Matt',
            'age' => (int) 24,
            'marks' => (int) 85
        ]
    ]
]

\src\Controller\PagesController.php (line 63)

[
    (int) 20 => [
        (int) 0 => [
            'name' => 'Bob',
            'age' => (int) 20,
            'marks' => (int) 50
        ],
        (int) 1 => [
            'name' => 'Ryan',
            'age' => (int) 20,
            'marks' => (int) 57
        ]
    ],
    (int) 23 => [
        (int) 0 => [
            'name' => 'Allen',
            'age' => (int) 23,
            'marks' => (int) 70
        ],
        (int) 1 => [
            'name' => 'Duke',
            'age' => (int) 23,
            'marks' => (int) 67
        ]
    ],
    (int) 24 => [
        (int) 0 => [
            'name' => 'Matt',
            'age' => (int) 24,
            'marks' => (int) 85
        ]
    ]
]
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, for adding detailed solutions.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.