twan
twan

Reputation: 2659

How can I create a multidimensional array with this string in PHP

I've got the following string which is inside $vars:

Formaat : 60 cm | Kleur : century oak | Prijs: 45,00\
Formaat : 60 cm | Kleur : dark oak | Prijs: 45,00\
Formaat : 60 cm | Kleur : grey | Prijs: 45,00\
Formaat : 80 cm | Kleur : century oak | Prijs: 75,00\
Formaat : 80 cm | Kleur : dark oak | Prijs: 75,00\
Formaat : 80 cm | Kleur : grey | Prijs: 75,00\

I did the following to split every line:

$vars =  $artikel['variabelen'];
$variabelebackslash = explode('\\', $vars);
echo '<pre>';
print_r($variabelebackslash);
echo '</pre>';

Which gives me this result:

Array
(
    [0] => Formaat : 60 cm | Kleur : century oak | Prijs: 45,00
    [1] => Formaat : 60 cm | Kleur : dark oak | Prijs: 45,00
    [2] => Formaat : 60 cm | Kleur : grey | Prijs: 45,00
    [3] => Formaat : 80 cm | Kleur : century oak | Prijs: 75,00
    [4] => Formaat : 80 cm | Kleur : dark oak | Prijs: 75,00
    [5] => Formaat : 80 cm | Kleur : grey | Prijs: 75,00
)

Now I want to create a multidimensional array which would look like this:

Array
(
    array
    (
        Formaat => "60cm",
        Kleur => "century oak",
        Prijs => "45,00"
    )
    array
    (
        Formaat => "60cm",
        Kleur => "dark oak",
        Prijs => "45,00"
    )
    array
    (
        Formaat => "60cm",
        Kleur => "grey",
        Prijs => "45,00"
    )
    array
    (
        Formaat => "80cm",
        Kleur => "century oak",
        Prijs => "75,00"
    )
    array
    (
        Formaat => "80cm",
        Kleur => "dark oak",
        Prijs => "75,00"
    )
    array
    (
        Formaat => "80cm",
        Kleur => "grey",
        Prijs => "75,00"
    )
)

How can I do this?

I've tried further splitting the values like this:

foreach($variabelebackslash as $varback){
    $varpijp .= explode('|', $varback);
}
echo '<pre>';
print_r($varpijp);
echo '</pre>';

But this returns:

ArrayArrayArrayArrayArrayArrayArray

Upvotes: 1

Views: 58

Answers (1)

Syscall
Syscall

Reputation: 19780

You are concatenate as string .= an array. So the array is converted to a string "Array", with a "Array to string conversion" warning.

You could use a combination of array_map(), array_column() to convert your initial array to your expected array:

$variabelebackslash = array(
     'Formaat : 60 cm | Kleur : century oak | Prijs: 45,00',
     'Formaat : 60 cm | Kleur : dark oak | Prijs: 45,00',
     'Formaat : 60 cm | Kleur : grey | Prijs: 45,00',
     'Formaat : 80 cm | Kleur : century oak | Prijs: 75,00',
     'Formaat : 80 cm | Kleur : dark oak | Prijs: 75,00',
     'Formaat : 80 cm | Kleur : grey | Prijs: 75,00'
);


// Foreach element of the array,
$varpijp = array_map(function($val){
    // split using | and trim values.
    $values = array_map('trim', explode('|', $val));

    // foreach elements,
    $keyvals = array_map(function($val) {
        // explode using : and trim them:
        return array_map('trim', explode(':', $val));
    }, $values);

    // create associative array using $keyvals array:
    return array_column($keyvals, 1, 0);
}, $variabelebackslash);


echo '<pre>';
print_r($varpijp);
echo '</pre>';

Outputs:

Array
(
    [0] => Array
        (
            [Formaat] => 60 cm
            [Kleur] => century oak
            [Prijs] => 45,00
        )

    [1] => Array
        (
            [Formaat] => 60 cm
            [Kleur] => dark oak
            [Prijs] => 45,00
        )

    [2] => Array
        (
            [Formaat] => 60 cm
            [Kleur] => grey
            [Prijs] => 45,00
        )

    [3] => Array
        (
            [Formaat] => 80 cm
            [Kleur] => century oak
            [Prijs] => 75,00
        )

    [4] => Array
        (
            [Formaat] => 80 cm
            [Kleur] => dark oak
            [Prijs] => 75,00
        )

    [5] => Array
        (
            [Formaat] => 80 cm
            [Kleur] => grey
            [Prijs] => 75,00
        )

)

Upvotes: 2

Related Questions