如何过滤多维数组并创建一个新数组

How to Filter multidimensional array and create a new array

我有这种数组,基于页面 ID,例如:32,143。

我想搜索数组键 position 中是否有 both 值,然后忽略 prepend附加值并考虑ONLYboth值。

并且如果数组有NO both值和多个prepend追加值,然后会根据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', ), ), )

我认为我可以将此任务归结为的最低时间复杂度是使用输入数组的 1 个完整循环,然后是分组数据循环和嵌套循环,以隔离具有最低优先级值的行。

第一个循环进行分组,并可能舍弃无价值的 non-both 行以节省微不足道的内存。

第二个循环迭代 page 组,然后内部循环优先使用 both 行,如果没有 both 行,则仅使用 non-both 行。 ifelseif 确保只保留优先级最低的行。我添加了一个 rsort() 调用,假设您想要 append 行之前的 prepend 行。如果不需要对位置值进行优先排序,则省略包含 rsort() 调用的条件块。

代码:(Demo)

$array = [
    ['page' => '32', 'position' => 'append', 'priority' => '1'],
    ['page' => '32', 'position' => 'append', 'priority' => '2'],
    ['page' => '32', 'position' => 'prepend', 'priority' => '3'],
    ['page' => '32', 'position' => 'both', 'priority' => '3'],
    ['page' => '32', 'position' => 'prepend', 'priority' => '4'],
    ['page' => '143', 'position' => 'prepend', 'priority' => '18'],
    ['page' => '143', 'position' => 'append', 'priority' => '18'],
    ['page' => '143', 'position' => 'prepend', 'priority' => '19'],
];

$result = [];
foreach ($array as $row) {
    if (!isset($result[$row['page']])) {
        $result[$row['page']] = ['both' => [], 'non-both' => []];
    }
    if ($row['position'] !== 'both') {
        if ($result[$row['page']]['both']) {
            continue; // nothing worth doing in this case, ignore the row
        } else {
            $result[$row['page']]['non-both'][] = $row;
        }
    } else {
        $result[$row['page']]['both'][] = $row;
    }
}

foreach ($result as $page => $rows) {
    $keep = [];
    foreach ($rows['both'] ?: $rows['non-both'] as $row) {
        if (!$keep || $row['priority'] < $keep[0]['priority']) {
            $keep = [$row];
        } elseif ($row['priority'] === $keep[0]['priority']) {
            $keep[] = $row;
        }
    }
    if ($keep[0]['position'] !== 'both') {
        rsort($keep);  // assuming you need prepend to occur before append
    }
    $result[$page] = $keep;
}
var_export($result);