1

we have an array like this :

Array
(
    [0] => Array
        (
            [value] => aaa
            [parent_id] => 5
        )

    [1] => Array
        (
            [value] => bbb 
            [parent_id] => 3
        )

    [2] => Array
        (
            [value] => ccc
            [parent_id] => 3
        )

)

as you can see 2 index have same [parent_id] , we need convert this array to this

Array
(
    [0] => Array
        (
            [parent_id] => 5
            [sub] => Array(
                             [0] =>(
                                      [value] => aaa
                                   )
                         )
        )

    [1] => Array
        (
            [parent_id] => 3
            [sub] => Array(
                             [0] =>(
                                      [value] => bbb
                                   )
                             [1] =>(
                                     [value] => ccc
                                  )
                         )
        )

)

in php we used this functions :

foreach ($Array as $item) {
         $item['subs'] = array();
         $indexedItems[$item['parent_id']] = (object) $item;
}
for($i=0; $i<count($Array); $i++){
     if($Array[$i]['parent_id'] == $Array[$i-1]['parent_id']){
            $indexedItems[$item['parent_id']]->subs[]=$Array[$i]['value'];
      }
}

but it doesnot works , can you help us to do that , please ?

1 Answer 1

1

If u realy want that complicated array you gave as example you have to track the parent_id. This is how :

<?php

$foo = [
        [
            'value' => 'aaa',
            'parent_id' => 900,
        ],
        [
            'value' => 'aaa',
            'parent_id' => 813,
        ],
        [
            'value' => 'aaa',
            'parent_id' => 900,
        ],
        [
            'value' => 'aaa',
            'parent_id' => 813,
        ],      
    ];
$indexed = [];
foreach($foo as $f) {
    $index = getParentIndex($indexed, $f['parent_id']);
    if ($index === null) {
        $indexed[] = [
                        'parent_id' => $f['parent_id'],
                        'subs'      => [
                                        ['value' => $f['value'] ],
                                       ],
                     ];
    }else{
        $indexed[$index]['subs'][] = [ 'value' => $f['value'], ];
    }
}

function getParentIndex($array, $parent_id) {
    for($i=0;$i<count($array);$i++) {
        if ($array[$i]['parent_id'] == $parent_id) return $i;
    }
    return null;
}

var_dump($indexed);

However, this looks a very complicated array to work with imho. I would suggest the following snippet :

$indexed = [];

foreach($foo as $f) {
    if (!isset($indexed[$f['parent_id']])) $indexed[$f['parent_id']] = [];
    $indexed[$f['parent_id']][] = $f['value'];
}
var_dump($indexed);

This will output an array similar to :

array (size=2)
  900 => 
    array (size=2)
      0 => string 'aaa' (length=3)
      1 => string 'aaa' (length=3)
  813 => 
    array (size=2)
      0 => string 'aaa' (length=3)
      1 => string 'aaa' (length=3)
Sign up to request clarification or add additional context in comments.

1 Comment

The by you suggested array structure is a lot better imho. +1

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.