如何过滤PHP多维数组,按position规则与priority优先级生成新数组
PHP多维数组按规则过滤实现
需求规则
现有按Page ID(如32、143)分组的多维数组,需按照以下规则过滤生成新数组:
- 若分组下元素的
position键存在值为both的项,直接忽略所有值为prepend、append的项,仅保留position值为both的项 - 若分组下没有
position值为both的项,存在多个prepend和append类型的项时,按priority键的值取优先级最高的对应项
原数组结构
$sort_result = Array ( [32] => Array ( [0] => Array ( [page] => 32 [position] => append [priority] => 1 ) [1] => Array ( [page] => 32 [position] => append [priority] => 2 ) [2] => Array ( [page] => 32 [position] => prepend [priority] => 3 ) [3] => Array ( [page] => 32 [position] => both [priority] => 3 ) [4] => Array ( [page] => 32 [position] => prepend [priority] => 4 ) ) [143] => Array ( [0] => Array ( [page] => 143 [position] => prepend [priority] => 19 ) [1] => Array ( [page] => 143 [position] => prepend [priority] => 18 ) [2] => Array ( [page] => 143 [position] => append [priority] => 18 ) ) )
最初的错误实现代码
<?php foreach ( $modify_array as $key => $value ) { foreach( $value as $k1 => $v1) { if ( array_search( "both", $v1 ) ) { $final_array[$key][$k1] = $v1; } else{ if ( array_search( "prepend", $v1 ) ) { $final_array[$key][$k1] = $v1; } if ( array_search( "append", $v1 ) ) { $final_array[$key][$k1] = $v1; } } break; } }
期望输出结构
Array ( [32] => Array ( [3] => Array ( [page] => 32 [position] => both [priority] => 3 ) ) [143] => Array ( [1] => Array ( [page] => 143 [position] => prepend [priority] => 18 ) [2] => Array ( [page] => 143 [position] => append [priority] => 18 ) ) )
更新1:调试完成的可运行代码
$modify_array = array(); foreach ( $sort_result as $sort_result_key => $sort_result_value ) { $modify_array[$sort_result_value['page']][] = $sort_result_value; } foreach ( $modify_array as $key => $value ) { $filter_array[$key]['both_yes'] = array_keys(array_column($value, 'position'),'both'); $filter_array[$key]['prepend_yes'] = array_keys( array_column($value, 'position'),'prepend'); $filter_array[$key]['append_yes'] = array_keys(array_column($value, 'position'),'append'); } foreach ( $filter_array as $filter_array_key => $filter_array_value ) { if ( ! empty( $filter_array_value['both_yes'])) { $a = $filter_array_value['both_yes'][0]; $final_array[] = $modify_array[$filter_array_key][$a]; } else { if ( ! empty( $filter_array_value['prepend_yes'])) { $b = $filter_array_value['prepend_yes'][0]; $final_array[] = $modify_array[$filter_array_key][$b]; } if ( ! empty( $filter_array_value['append_yes'])) { $c = $filter_array_value['append_yes'][0]; $final_array[] = $modify_array[$filter_array_key][$c]; } } }
更新2:var_export输出的原数组
array ( 32 => array ( 0 => array ( 'page' => '32', 'position' => 'append', 'priority' => '1', ), 1 => array ( 'page' => '32', 'position' => 'append', 'priority' => '2', ), 2 => array ( 'page' => '32', 'position' => 'prepend', 'priority' => '3', ), 3 => array ( 'page' => '32', 'position' => 'both', 'priority' => '3', ), 4 => array ( 'page' => '32', 'position' => 'prepend', 'priority' => '4', ), ), 143 => array ( 0 => array ( 'page' => '143', 'position' => 'prepend', 'priority' => '18', ), 1 => array ( 'page' => '143', 'position' => 'append', 'priority' => '18', ), 2 => array ( 'page' => '143', 'position' => 'prepend', 'priority' => '19', ), ), )
内容的提问来源于stack exchange,提问作者Parthavi Patel
相关产品推荐
相关产品推荐

