6

たとえば、次の配列があります。

[food] => Array (
    [fruits] => apple
    [vegetables] => garlic
    [nuts] => cashew
    [meat] => beaf
)

特定のキーと値の組み合わせの位置を変更する必要があります。

[果物] => リンゴを 3 番目の位置に移動する必要があるとしましょう

[food] => Array (
    [vegetables] => garlic
    [nuts] => cashew
    [fruits] => apple
    [meat] => beaf
)

キーまたは値によるソートについて話しているのではありません。キー値の位置を非常に厳密な新しい位置に変更する必要があります。

何かのようなもの:

change_pos($my_arr, $key_to_move, $new_index);

=>

change_pos($my_arr, "fruits", 3);

それは可能ですか?

4

3 に答える 3

7

大変でしたが、最終的に:

<?php
function array_splice_assoc(&$input, $offset, $length, $replacement) {
        $replacement = (array) $replacement;
        $key_indices = array_flip(array_keys($input));
        if (isset($input[$offset]) && is_string($offset)) {
                $offset = $key_indices[$offset];
        }
        if (isset($input[$length]) && is_string($length)) {
                $length = $key_indices[$length] - $offset;
        }

        $input = array_slice($input, 0, $offset, TRUE)
                + $replacement
                + array_slice($input, $offset + $length, NULL, TRUE);
}
function array_move($which, $where, $array)
{
    $tmpWhich = $which;
    $j=0;
    $keys = array_keys($array);

    for($i=0;$i<count($array);$i++)
    {
        if($keys[$i]==$tmpWhich)
            $tmpWhich = $j;
        else
            $j++;
    }
    $tmp  = array_splice($array, $tmpWhich, 1);
    array_splice_assoc($array, $where, 0, $tmp);
    return $array;
}
$array = array('fruits' => 'apple','vegetables' => 'garlic','nuts' => 'cashew','meat' => 'beaf');
$res = array_move('vegetables',2,$array);
var_dump($res);
?>
于 2013-03-01T21:53:08.023 に答える
3

MIIB の尽力に感謝します。私は彼の努力に対する彼の答えを受け入れます。

しかし、私は自分により適した解決策を思いついたので、それを使用します.

function ksort_arr (&$arr, $index_arr) {
    $arr_t=array();
    foreach($index_arr as $i=>$v) {
        foreach($arr as $k=>$b) {
            if ($k==$v) $arr_t[$k]=$b;
        }
    }
    $arr=$arr_t;
}

$arr=array("fruits"=>"apple","vegetables"=>"garlic","nuts"=>"cashew","meat"=>"beaf");
$index_arr=array("vegetables","meat","fruits","nuts");
ksort_arr($arr,$index_arr);
print_r($arr);

結果

Array
(
    [vegetables] => garlic
    [meat] => beaf
    [fruits] => apple
    [nuts] => cashew
)
于 2013-03-11T15:07:04.240 に答える
2

これは、2 番目の配列を使用した、はるかに単純なソリューションです。また、新しいインデックス パラメータの基本的な検証も提供します。連想配列でのみ使用することを意図しています。数値配列で使用しても意味がありません。

function array_move($key, $new_index, $array)
{
    if($new_index < 0) return;
    if($new_index >= count($array)) return;
    if(!array_key_exists($key, $array)) return;

    $ret = array();
    $ind = 0;
    foreach($array as $k => $v)
    {
      if($new_index == $ind)
      {
        $ret[$key] = $array[$key];
        $ind++;
      }
      if($k != $key)
      {
        $ret[$k] = $v;
        $ind++;
      }
    }
    // one last check for end indexes
    if($new_index == $ind)
        $ret[$key] = $array[$key];


    return $ret;
}
于 2014-12-04T07:18:07.150 に答える