Рекурсивная функция для перемещения определенного ключа в многомерном массиве к нижней части его уровня - PullRequest
0 голосов
/ 01 июня 2018

Я ищу функцию php (sort?), Которая перемещает определенную клавишу ('current_files') к нижней части уровня массива.

У меня есть что-то вроде этого:

[A] => [
     [current_files] => [
           [0] => ...
           [1] => ...  
     ]
     [D] => [
          [G] => [...]   
          [current_files] => [...]
          [B] => [...]
     ]
]
[current_files] => [...]
[K] => [...]

Мне нужно это:

[A] => [
     [D] => [
          [G] => [...]   
          [B] => [...]
          [current_files] => [...]
     ]
     [current_files] => [
           [0] => ...
           [1] => ...  
     ]
]
[K] => [...]
[current_files] => [...]

Я знаю, что мне нужна рекурсивная функция типа arr_multisort, но я не понимаю ее -_-

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Как вы уже знаете, ключ элемента, который вы хотите переместить, может быть довольно простым с помощью рекурсивной функции.Вы используете '&' просто для передачи массива в качестве ссылки.

function moveCurrentFiles(&$array) {
    //first move current_files to the end of the array
    if (isset($array["current_files"])) {
        $currentFiles = $array["current_files"];
        //unset then reset value to "move" it to the end
        unset($array["current_files"]);
        $array["current_files"] = $currentFiles;
    }

    //loop through array items to check if any of them are arrays
    foreach($array as &$value) {
         if (is_array($value)) {
             //recursively call this function on that array
             moveCurrentFiles($value);
         }
    }
}
0 голосов
/ 01 июня 2018

Попробуйте это

Записать обычную функцию, просто вызовите эту функцию, чтобы переместиться вниз на любую клавишу, передав конкретный ключ в качестве аргумента.

function sortArrayByKey(&$array, $search_key) {
    $searched_key_arr = array();
    foreach ($array as $k => &$values) {
        if (array_key_exists($search_key, $values)) {
            sortArrayByKey($values, $search_key);
        } else if ($k == $search_key) {
            $searched_key_arr[$k] = $values;
            unset($array[$k]);
        }
    }
    if (!empty($searched_key_arr)) {
        foreach ($searched_key_arr as $key => $val) {
            $array[$key] = $val;
        }
    }
    return $array;
}

$arr = $this->sortArrayByKey($data, 'current_files'); //$data is your input array
print_r($arr);
0 голосов
/ 01 июня 2018

Самый простой способ - удалить ключ из исходного массива и вставить его в конец.

примерно так:

$keyToMove = 'current_files';
if (array_key_exists($keyToMove, $arrayToSort)) {
    $tmp = $arrayToSort[$keyToMove]; // extract the key to move
    unset($arrayToSort[$keyToMove]); // unset the key from the array
    $arrayToSort[$keyToMove] = $tmp; // add the saved data in the end
}

Тогда, если у вас есть многомерный массив для "сортировки"«Вам придется запустить это рекурсивно.

...