根据PHP中该数组内部键的值过滤数组

时间:2017-07-27 22:06:40

标签: php arrays array-filter

我有大量已解析的XML记录,它们由两个属性相关联:idrid

这些XML记录在解析时会创建以下(示例)PHP数组:

Array(
   'master' => array(
      [0] => array( 'id' => 123, 'info' => 'hello' ),
      [1] => array( 'id' => 456, 'info' => 'world' )
   ),
   'tbl-ex' => array(
      [0] => array( 'rid' => 123, 'test' => 'aye', 'num' => 88 ),
      [1] => array( 'rid' => 123, 'test' => 'bbb', 'num' => 99 ), 
      [2] => array( 'rid' => 456, 'test' => 'zzz', 'num' => 102, 'o' => 'h')
   ),
   'tbl-ey' => array(
      [0] => array( 'rid' => 456, 'mama' => 'mia' ),
      [1] => array( 'rid' => 123, 'oof' => 'foo' )
   ),
   'tbl-ez' => array(
      [0] => array( 'rid' => 123, 'stop' => 'wegetit', 'ok' => 1 ),
      [1] => array( 'rid' => 456, 'finally' => 'done' )
   )
);

当我解析这个时,我希望master下的所有记录都以id == rid的条件返回,格式为:

Array(
  [0] => array(
     'master' => array( 'id' => 123, 'info' => 'hello' ),
     'tbl-ex' => array( 
         [0] => array( 'test' => 'aye', 'num' => 88 ),
         [1] => array( 'test' => 'bbb', 'num' => 99 )
     ),
     'tbl-ey' => array(
         [0] => array( 'oof' => 'foo' )
     ),
     'tbl-ez' => array(
         [0] => array( 'stop' => 'wegetit', 'ok' => 1 )
      )
  ),
  [1] => array(
     'master' => array( 'id' => 456, 'info' => 'world' ),
     'tbl-ex' => array( 
         [0] => array( 'test' => 'zzz', 'num' => 102, 'o' => 'h' )
     ),
     'tbl-ey' => array(
         [0] => array( 'mama' => 'mia' )
     ),
     'tbl-ez' => array(
         [0] => array( 'finally' => 'done' )
      )
  )
);

这似乎很明显(并且有效):

$ret = array();

$init_record = $original_array['master'];
$records_to_merge = $original_array;
unset($records_to_merge['master']);

$i = 0;
foreach($init_record as $master_index => $master){
   $current_id = $master['id']; 
   foreach($records_to_merge as $record_type => $record_array){
       foreach($record_array as $index => $record){
           if($current_id == $record['rid']){
              $ret[$i]['master'] = $master;
              $ret[$i][$record_type] = $record;
              $i++;
           }
       }
    }
}

这很有效,但由于我有大量的记录(以及更多的数据),所以它的速度极慢。

然后我尝试使用带有回调函数的array_filter来评估$record,然后索引rid等于$master_id。然而,这会过滤掉匹配记录,而不是它所包含的整个数组。所以我只是在我的数组中获得了一堆匹配的rid,但没有其他数据。

我现在可以忽略一些快速,简单的方法吗?

1 个答案:

答案 0 :(得分:1)

这是一个只有一个嵌套foreach而不是两个嵌套的解决方案。我不确定它是否会有所不同,因为数组的每个元素都是迭代完成的。它对新数组的结构进行了一次更改:外部数组是关联的而不是仅仅是索引的。但是应该保留订单。

php > $original = array(
php (    'master' => array(
php (       array( 'id' => 123, 'info' => 'hello' ),
php (       array( 'id' => 456, 'info' => 'world' )
php (    ),
php (    'tbl-ex' => array(
php (       array( 'rid' => 123, 'test' => 'aye', 'num' => 88 ),
php (       array( 'rid' => 123, 'test' => 'bbb', 'num' => 99 ), 
php (       array( 'rid' => 456, 'test' => 'zzz', 'num' => 102, 'o' => 'h')
php (    ),
php (    'tbl-ey' => array(
php (       array( 'rid' => 456, 'mama' => 'mia' ),
php (       array( 'rid' => 123, 'oof' => 'foo' )
php (    ),
php (    'tbl-ez' => array(
php (       array( 'rid' => 123, 'stop' => 'wegetit', 'ok' => 1 ),
php (       array( 'rid' => 456, 'finally' => 'done' )
php (    )
php ( );
php > 
php > //$merge = $original;
php > //unset($merge['master']);
php > unset($pointer);
php > 
php > 
php > foreach($original as $tbl => $data) {
php {     
php {     foreach($data as $row) {
php {         if($tbl=='master') {
php {             $pointer[$row['id']]['master'] = $row;
php {             continue;
php {         }
php {         $pointer[$row['rid']][$tbl][] = $row;
php {         
php {     }
php {     
php { }
php > 
php > print_r($pointer);
Array
(
    [123] => Array
        (
            [master] => Array
                (
                    [id] => 123
                    [info] => hello
                )

            [tbl-ex] => Array
                (
                    [0] => Array
                        (
                            [rid] => 123
                            [test] => aye
                            [num] => 88
                        )

                    [1] => Array
                        (
                            [rid] => 123
                            [test] => bbb
                            [num] => 99
                        )

                )

            [tbl-ey] => Array
                (
                    [0] => Array
                        (
                            [rid] => 123
                            [oof] => foo
                        )

                )

            [tbl-ez] => Array
                (
                    [0] => Array
                        (
                            [rid] => 123
                            [stop] => wegetit
                            [ok] => 1
                        )

                )

        )

    [456] => Array
        (
            [master] => Array
                (
                    [id] => 456
                    [info] => world
                )

            [tbl-ex] => Array
                (
                    [0] => Array
                        (
                            [rid] => 456
                            [test] => zzz
                            [num] => 102
                            [o] => h
                        )

                )

            [tbl-ey] => Array
                (
                    [0] => Array
                        (
                            [rid] => 456
                            [mama] => mia
                        )

                )

            [tbl-ez] => Array
                (
                    [0] => Array
                        (
                            [rid] => 456
                            [finally] => done
                        )

                )

        )

)
php > 
相关问题