изменить значение ключа в массиве и переставить целый многомерный массив - PullRequest
0 голосов
/ 12 марта 2019

у меня есть массив ниже

Array
(
    [0] => Array
        (
            [id] => 1
            [title] => task 1
            [tech_user_id] => 1
            [dev_priority] => 1
        )

    [1] => Array
        (
            [id] => 2
            [title] => task 2
            [tech_user_id] => 1
            [dev_priority] => 2
        )

    [2] => Array
        (
            [id] => 3
            [title] => task 3
            [tech_user_id] => 1
            [dev_priority] => 3
        )

    [3] => Array
        (
            [id] => 4
            [title] => task 4
            [tech_user_id] => 1
            [dev_priority] => 4
        )

)

Я хочу изменить приоритет задачи и переставить весь массив.

Например: если я хочу изменить dev_priority задачи title = "task 3" с 3 на 1, тогда dev_priority "задачи 1" должно быть 2, а dev_priority для "задачи 2" должно быть 3.

хочет написать функцию перестановки, в которой мы передаем $id, а $set_priority и $set_priority должны быть присвоены данному $id и перестановке всего массива на основе dev_priority.

rearrange($id, $set_priority) {
    // ...
}

Ожидаемый результат:

Array
(
    [0] => Array
        (
            [id] => 3
            [title] => task 3
            [tech_user_id] => 1
            [dev_priority] => 1
        )
    [1] => Array
        (
            [id] => 1
            [title] => task 1
            [tech_user_id] => 1
            [dev_priority] => 2
        )

    [2] => Array
        (
            [id] => 2
            [title] => task 2
            [tech_user_id] => 1
            [dev_priority] => 3
        )


    [3] => Array
        (
            [id] => 4
            [title] => task 4
            [tech_user_id] => 1
            [dev_priority] => 4
        )

)

1 Ответ

0 голосов
/ 12 марта 2019
<?php 

function reArrange(&$result,$id,$new_dev_priority){
    $curr_index  = array_search($id,array_column($result,"id"),true);
    $limit_index = array_search($new_dev_priority,array_column($result,"dev_priority"),true);

    $process_node = $result[$curr_index];
    $curr_dev_priority = $process_node['dev_priority'];
    if($curr_dev_priority === $new_dev_priority) return; // return if same priority was assigned.    
    $offset = $curr_dev_priority > $new_dev_priority ? -1 : 1;

    /* rearrange by relocating elements to a new location(this is a minimized shift) */
    while($curr_index != $limit_index){
        $result[$curr_index] = $result[$curr_index + $offset];
        $result[$curr_index]['dev_priority'] = $result[$curr_index]['dev_priority'] - $offset;        
        $curr_index += $offset;
    }  

    $process_node['dev_priority'] = $new_dev_priority; // assign new dev priority
    $result[$curr_index] = $process_node;
}

Демонстрация: https://3v4l.org/nggja

  • Мы получаем текущий индекс процесса и индекс процесса, который имеет желаемый новый приоритет разработки.
  • Мы делаем это потому, что хотим перемещать элементы только из нашего текущего местоположения до нашего желаемого местоположения.Вывод не относящихся к делу процессов из этого диапазона тривиален.
  • Мы определяем переменную с именем offset, которая просто определяет направление сдвига.-1 вверх и 1 вниз.
  • Сложность времени: O (n) (в худшем случае), Сложность пространства: O (1) .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...