Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CakePHP function to convert dotted arrays to multidimensional

In CakePHP, it seems like a lot of functions can take their arguments as nested, multidimensional arrays, or as dotted strings:

$this->MyModel->contain(array(
    'Something', 'Something.Else', 'Something.Else.Entirely'
));
$this->MyModel->contain(array(
    'Something' => array(
        'Else' => 'Entirely'
    )
));

Therefore, I figure there must be a function somewhere in the core to switch from dotted to nested associative, but I can't find it for the life of me. Any ideas?

like image 421
nickf Avatar asked Jun 10 '26 04:06

nickf


2 Answers

I've actually figured my own way to get this working leveraging the built-in Set functions.

Given:

$input = array (
    'Post.id' => 1,
    'Post.title' => 'Some post title.',
    'Post.Tag.0.id' => 4,
    'Post.Tag.0.name' => 'cakephp',
    'Post.Tag.1.id' => 7,
    'Post.Tag.1.name' => 'mysql',
);

This code will put that into a nested associative array.

$output = array();
foreach ($input as $key => $value) {
    $output = Set::insert($output, $key, $value);
}

Here's the docs for Set::insert()

like image 134
nickf Avatar answered Jun 18 '26 00:06

nickf


What you're looking for is Set::flatten(). It's not documented in the CakePHP manual, but take a look at the API definition.

It works something like this (the result might not be exact, this is from my head):

$array = array(
    'Post' => array(
        'id' => 1,
        'title' => 'Some post title.',
        'Tag' => array(
            0 => array(
                'id' => 4,
                'name' => 'cakephp',
            ),
            1 => array(
                'id' => 7,
                'name' => 'mysql',
            ),
        ),
    );
);

$array = Set::flatten($array);
var_dump($array);

Your $array variable will now look like this:

Array (
    'Post.id' => 1,
    'Post.title' => 'Some post title.',
    'Post.Tag.0.id' => 4,
    'Post.Tag.0.name' => 'cakephp',
    'Post.Tag.1.id' => 7,
    'Post.Tag.1.name' => 'mysql',
)
like image 43
Matt Huggins Avatar answered Jun 18 '26 00:06

Matt Huggins



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!