iT邦幫忙

0

PHP 遍例關聯數組,更改關聯數組的key值

我有一個關聯數組:
$data = array('log_account' => 'white','log_status' => 'sql_insert');
我想要更改key,讓數組變成以下新數組
$data = array('account' => 'white','status' => 'sql_insert');

foreach($data as &$data_key=>$data_value){
			if($data_key=="log_account"){
				$data_key = "account";

			}
 			if($data_key=="log_status"){
				$data_key = "status";
			}           
            
		}

但這樣印出來資料一樣是沒有變更的,
如果是更改$data_value用&,是有用的,但是要更改$data_key就不行
想請問要怎麼做呢?

PS:補充其實有想到創建新數組的作法,但想要確定在foreach時後,是不是也有用&方法更改key的作法

		$param = array();
		foreach($data as $data_key=>$data_value){
			if($data_key=="account_id"){
				//$data_key = "log_account";
				$param["log_account"] = $data_value;
			}
			else if($data_key=="log_status"){
				$param["status"] = $data_value;
			}
			else {
				$param[$data_key] = $data_value;
			}
		}
$data_key和$data並沒有reference的關係。
他是在as過程中產生出來的變數。
所以你改$data_key時,$data本身並不會產生任何的改變。
原來如此,看來要用&只能去改變value,無法直接ref key,謝謝。
不完全這樣。
如果要清楚了解可能比較需要了解php的變數什麼時候是call by reference,什麼時候是call by value
很多語言其實也是這樣。
像swift的class是call by reference,但struct卻是call by value。
長得很像的設計結構本質操作卻完全的不同。
call by reference表示參考的是同一個記憶體區段。
所以你要是改的是reference當然所有對這個參考的變數就通通被改掉了。
call by value的話就是各自獨立的記憶體,相互沒有關係。

1 個回答

0
weiclin
iT邦高手 4 級 ‧ 2018-02-25 02:04:26
最佳解答
$data = ['log_account' => 'white', 'log_status' => 'sql_insert'];

$newData = array_combine(
    array_map(function ($key) {
        return preg_replace("#^log_#", "", $key);
    }, array_keys($data)),
    array_values($data)
);

謝謝,array_map也是個作法,看來用&是無法改變key的值,只能ref value。

weiclin iT邦高手 4 級 ‧ 2018-02-25 15:14:49 檢舉

我是建議不要一邊遍歷陣列又一邊改變陣列, 這不是一個好習慣

我要發表回答

立即登入回答