如果具有相同的值,php会将两个数组索引放在一个子数组中

时间:2014-12-06 15:40:33

标签: php arrays

我们有一个这样的数组:

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

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

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

)

正如您所看到的,2索引具有相同的[parent_id],我们需要将此数组转换为此

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

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

)
在php中我们使用了这个函数:

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'];
      }
}

但是它没有用,你能帮我们做吗?

1 个答案:

答案 0 :(得分:1)

如果您真的想要那个复杂的数组,那么您必须跟踪parent_id。 这是如何:

<?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);

但是,这看起来非常复杂,可以使用imho。 我建议使用以下代码段:

$indexed = [];

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

这将输出类似于:

的数组
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)