2
在下面的代碼中,我很難理解爲什麼變量$service_category_tree
自己改變。不知何故,subscription_tree
alter是參數變量,儘管它沒有通過引用傳遞。PHP變量本身雖然沒有通過引用傳遞
$service_category_tree = $this->service_category_model->with_request_forms();
foreach ($this->view_data['users'] as &$user) {
echo md5(serialize($service_category_tree))."<br>"; // To check if the variable is changed.
$user->service_categories = $this->merchant_model->subscription_tree($user->id, $service_category_tree);
}
的MD5語句的輸出,你可以看到表明變量改變:
10066a31bb6e191fbb94b8dc61fd6e55
10066a31bb6e191fbb94b8dc61fd6e55
fd1e22aa74c048e88751c85528d23254
752e0cef4357d7a33e47b90ef207d396
8b5b6ea856080bf32b9bfecc4e43a3f6
8b5b6ea856080bf32b9bfecc4e43a3f6
8b5b6ea856080bf32b9bfecc4e43a3f6
3f3e7619e59e3776c395065e4278c3f8
3f3e7619e59e3776c395065e4278c3f8
dbfebae62d65bd04ce4ce74f2046f90e
34498709256b34ce4d843c1f735c4c6a
如下面的代碼看出subscription_tree
不具有第二參數的符號的方法。
function subscription_tree($merchant_id, $tree_array = NULL){
if($tree_array === NULL){
$this->load->model('service_category_model');
$tree_array = $this->service_category_model->with_request_forms();
}
if(is_array($tree_array) && count($tree_array)){
$my_request_forms = $this->request_forms($merchant_id)->result();
$my_service_categories = $this->service_categories($merchant_id)->result();
foreach ($tree_array as &$sc) {
// Indicate subscribed service categories
$sc->subscribed = FALSE;
if(is_array($my_service_categories) && count($my_service_categories)) {
foreach ($my_service_categories as $my_sc_key => $my_sc) {
if($my_sc->id == $sc->id){
$sc->subscribed = TRUE;
unset($my_service_categories[$my_sc_key]);
}
}
}
// Indicate subscribed request forms
if(is_array($sc->request_forms) && count($sc->request_forms)) {
foreach ($sc->request_forms as &$rf) {
$rf->subscribed = FALSE;
if(count($my_request_forms)) {
foreach($my_request_forms as $mrf_key => $my_request_form){
if ($my_request_form->id == $rf->id) {
$rf->subscribed = TRUE;
unset($my_request_forms[$mrf_key]);
break;
}
}
}
}
}
}
}
return $tree_array;
}
我看到
更多信息,但變量$ service_category_tree是一個數組,而不是一個對象。但是,在數組內有對象。我如何解決這個問題?我無法直接克隆$ service_category_tree。 –
我已經通過添加克隆對象並將其傳遞迴subscription_tree方法中的數組來實現它。基本上:$ curr_sc = clone $ sc;然後,在最後$ tree_array [$ key] = $ curr_sc; –
數組也通過引用傳遞。如果您嘗試直接更改元素,則會創建副本,但在您的情況下,它不會發生,因爲您通過'&$ sc'更改了參考值。如果你不需要它,不要改變物體。或者嘗試'serialize' /'unserialize' –