Bhumi Shah
Bhumi Shah

Reputation: 9476

Implode multidimensional array with different glue in php

I have array like below:

Array
(
    [22] => Array
        (
            [0] => 60
            [29] => Array
                (
                    [0] => 6
                )

            [30] => Array
                (
                    [0] => 5
                    [1] => 8
                )

            [31] => Array
                (
                    [0] => 7
                    [1] => 9
                    [2] => 14
                    [3] => 26
                )

        )

    [23] => 12
    [35] =>10
    [42] =>22
)

now i want to implode array like

60[6][5||8][7||9||14||26]|12|10|22

I have tried below code:

$arr = array_map(function($el){ return $el['tag_id']; }, $arr);
$str = implode(',', $arr);

But it is not implode with required glue

How can i do it?

Upvotes: 1

Views: 622

Answers (4)

Rakesh Lamp Stack
Rakesh Lamp Stack

Reputation: 490

This should work for you:

Here the glue is configurable as you desired and this logic is built on the recursive call hence this will work for any level of multidimensional array:

<?php
$arrVal =  array (
    '22' => array(
        '0' => 60,
        '29' => array(
            '0' => 6
        ),
        '30' => array (
            '0' => 5,
            '1' => 8
        ),
        '31' => array (
            '0' => 7,
            '1' => 9,
            '2' => 14,
            '3' => 26
        )
    ),
    '23' =>  12,
    '35' => 10,
    '42' => 22
);
//60[6][5||8][7||9||14||26]|12|10|22
$constructedValue = "";
$glue = "||";
echo $constructedValue = implodeMultiArr($arrVal,$glue);
function implodeMultiArr($arrVal,$glue) {
    $i = 0;
    $constructedValue = "";
    foreach ( $arrVal as $k=>$v) {
        if ( is_array($v) ) {
            $constructedValue .= !empty($constructedValue)  ? "[".implodeMultiArr($v,$glue)."]" : implodeMultiArr($v,$glue)."]" ;
        } else {
            $constructedValue .=  !empty($constructedValue)  ? $glue.$v : $v ;
        }
        $i++;
    }
    return $constructedValue;
} 

Upvotes: 0

sectus
sectus

Reputation: 15464

Desired result without foreach.

$array = [
    22 => [
        0 => 60,
        29 => [
            0 => 6
        ],
        30 => [
            0 => 5,
            1 => 8
        ],
        31 => [
            0 => 7,
            1 => 9,
            2 => 14,
            3 => 26
        ]
    ],
    23 => 12,
    35 => 10,
    42 => 22
];

$result = implode('|', array_map(function($item)
        {
        return is_array($item) // convert sub array into string
                 ? implode('', array_map(function($inner_item) 
                    {
                    return is_array($inner_item) // convert inner array into string
                             ? '[' . implode('||', $inner_item) . ']'
                             : $inner_item;
                    }, $item))
                 : $item;
        }, $array));
var_dump($result);

So, we have 3 types of delimiters: '|' - first level, ''(empty) - second level, '||' - third level.

Upvotes: 2

Ajeet Kumar
Ajeet Kumar

Reputation: 815

you can use this code

 <?php
$a= Array(
    22 => Array(
            0 => 60,
            29 => Array(
                    0 => 6
                ),

            30 => Array
                (
                    0 => 5,
                    1 => 8
                ),

            31 => Array
                (
                    0 => 7,
                    1 => 9,
                    2 => 14,
                    3 => 26
                ),

        ),

    23 => 12,
    35 =>10,
    42 =>22,
);
$string='';
foreach($a as $arr){
    if(is_array($arr)){
        foreach($arr as $array){
            if(is_array($array)){
                $string .= '['.implode("||",$array).']';
            }else{
                if($string!==''){ $string .= '|';}
                $string .= $array;
            }
        }
    }else{
        if($string!==''){ $string .= '|';}
        $string .= $arr;
    }

}
echo $string;die;

?>

Out put wil be

60[6][5||8][7||9||14||26]|12|10|22

Upvotes: 2

Raptor
Raptor

Reputation: 54212

You can use foreach and implode to achieve your pattern:

<?php
header('Content-Type: text/plain');
$arr = array();
$arr22 = array();
$arr22[0] = 60;
$arr22[29] = array(6);
$arr22[30] = array(5,8);
$arr22[31] = array(7,9,14,26);
$arr[22] = $arr22;
$arr[23] = 12;
$arr[35] = 10;
$arr[42] = 22;

$output = '';
foreach($arr as $entry) {
    if(!is_array($entry)) {
        $output .= $entry;
    } else {
        // array
        foreach($entry as $inner) {
            if(is_array($inner)) {
                $output .= '[' . implode('||', $inner) . ']';
            } else {
                $output .= $inner;
            }
        }
    }
    $output .= '|';
}
echo substr($output, 0, strlen($output) - 1);
?>

which outputs:

60[6][5||8][7||9||14||26]|12|10|22

Upvotes: 0

Related Questions