0

この連想配列でジムとジルをうまく切り替えることにとても近いように感じます。また、繰り返し可能にしたいので、最後に「ジョー」を追加すると、「ジム」と「ジョー」も入れ替わります。ポインタはありますか?

 <?php
 function jim_is_jill($their_name) {

    $first = key($their_name);

    foreach ($their_name as $key => $value) {
        $lastmaybe = $key;
    }   
        $lastmaybe = $these;              // Lastmaybe is Jill
        $these     = $first;

        return $their_name;
 }  

 $their_name = array(
 //       Key   =>  Value
         'Jim'   => 'dad', 
         'Josh'  => 'son', 
         'Jamie' => 'mom', 
         'Jane'  => 'daughter', 
         'Jill'  => 'daughter'
         );

 print_r(jim_is_jill($their_name));
 ?>

電流出力:

Array
(
    [Jim] => dad
    [Josh] => son
    [Jamie] => mom
    [Jane] => daughter
    [Jill] => daughter
)

必要な出力:

Array
(
    [Jill] => dad
    [Josh] => son
    [Jamie] => mom
    [Jane] => daughter
    [Jim] => daughter
)
4

2 に答える 2

3

配列を考える

$their_name = array(
 //   Key   =>  Value
    'Jim'   => 'dad', 
    'Josh'  => 'son', 
    'Jamie' => 'mom', 
    'Jane'  => 'daughter', 
    'Jill'  => 'daughter'
);

この関数は以下を生成します:

function array_swap_values($array, $key1, $key2) {
    $temp = $array[$key1];
    $array[$key1] = $array[$key2];
    $array[$key2] = $temp;
    return $array;
}

$their_name = array_swap_values($their_name, 'Jim', 'Jill');
// -> array(
//      'Jim'   => 'daughter', 
//      'Josh'  => 'son', 
//      'Jamie' => 'mom', 
//      'Jane'  => 'daughter', 
//      'Jill'  => 'dad'
// );

または、この関数は生成します

function array_swap_keys($array, $key1, $key2) {
    $ret = array();
    foreach ($array as $key => $value) {
        if ($key === $key1) {
            $ret[$key2] = $array[$key2];
        } else if ($key === $key2) {
            $ret[$key1] = $array[$key1];
        } else {
            $ret[$key] = $value;
        }
    }
    return $ret;
}

$their_name = array_swap_keys($their_name, 'Jim', 'Jill');
// -> array(
//      'Jill'  => 'daughter', 
//      'Josh'  => 'son', 
//      'Jamie' => 'mom', 
//      'Jane'  => 'daughter', 
//      'Jim'   => 'dad'
// );

**更新**

最後の編集の後、最後の関数を変更して、期待どおりのものを返しました。最初の関数にかなり近いですが、キーの順序は保持されます:

function array_swap_key_value($array, $key1, $key2) {
    $ret = array();
    foreach ($array as $key => $value) {
        if ($key === $key1) {
            $ret[$key2] = $array[$key1];
        } else if ($key === $key2) {
            $ret[$key1] = $array[$key2];
        } else {
            $ret[$key] = $value;
        }
    }
    return $ret;
}

$their_name = array_swap_key_value($their_name, 'Jim', 'Jill');
// -> array(
//      'Jill'  => 'dad', 
//      'Josh'  => 'son', 
//      'Jamie' => 'mom', 
//      'Jane'  => 'daughter', 
//      'Jim'   => 'daughter'
// );
于 2013-01-05T07:12:46.630 に答える
1

まず、私の経験では、配列が数値でインデックス付けされていない場合、配列の順序に依存するのは賢明ではありません。キーの位置を切り替えたり、キー自体を変更したりするツールはありません (間違っていたら訂正してください)。それは醜いハックでなければなりません。キーの名前を変更する唯一の方法は、キーを削除して正しく元に戻すことです。しかし、それは配列の順序を乱します。やりたいことを本当にやりたい場合は、Yanick が提案しているように、配列を最初から再構築する必要があります。これが最も簡単な方法です。しかし、もっときちんとした解決策があります。触れてはならない番号付きのインデックスを持つ配列を作成できます。そうすれば秩序が保たれます。次に、単純な小さな配列を各値に入れます。

array('name'=> 'Jill, 'relationship'=>'daughter);

そうすれば、(番号付きインデックスのおかげで)インデックスの順序を完全に制御でき、値を交換するだけで済みます。これは非常に簡単です。

または、これらの単語を省略して、番号付きのインデックスだけをどこにでも付けることもできます。そうすれば、書く量は減りますが、どれがどれであるかを覚えておく必要があります。

array('jill', 'daughter');

実質的には次と同じです:

array(0 => 'Jill', 1 => 'daughter');

だからここにコードがあります..

<?php

function swap_first_and_last($their_name) {

    //get first and last keys
    reset($their_name); // resets the array pointer to beginning
    $k_first=key($their_name); // first key
    end($their_name);
    $k_last=key($their_name); // last key



    // swap first and last:
    $swap = $their_name[$k_first]['name'];
    $their_name[$k_first]['name']=$their_name[$k_last]['name'];
    $their_name[$k_last]['name']=$swap;

    // note: you can use [0] and [1], if you modify your array that way

    return $their_name;
}

// modified array
 $their_name = array(
 // note, you can omit those 0 => , 1 => ,2,... keys
                 0 => array('name' => 'Jim', 'relationship' => 'dad'),
                 1 => array('name' => 'Josh', 'relationship' => 'son'),
                 2 => array('name' => 'Jamie', 'relationship' => 'mom'),
                 3 => array('name' => 'Jane', 'relationship' => 'daughter'),
                 4 => array('name' => 'Jill', 'relationship' => 'daughter')
                 );



var_dump(swap_first_and_last($their_name));

結果は次のとおりです。

array (size=5)
    0 => 
        array (size=2)
            'name' => string 'Jill' (length=4)
            'relationship' => string 'dad' (length=3)
    1 => 
        array (size=2)
            'name' => string 'Josh' (length=4)
            'relationship' => string 'son' (length=3)
    2 => 
        array (size=2)
            'name' => string 'Jamie' (length=5)
            'relationship' => string 'mom' (length=3)
    3 => 
        array (size=2)
            'name' => string 'Jane' (length=4)
            'relationship' => string 'daughter' (length=8)
    4 => 
        array (size=2)
            'name' => string 'Jim' (length=3)
            'relationship' => string 'daughter' (length=8)
于 2013-01-05T08:17:54.587 に答える