我有大量已解析的XML记录,它们由两个属性相关联:id
和rid
。
这些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
,但没有其他数据。
我现在可以忽略一些快速,简单的方法吗?
答案 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 >