codeigniter中的动态全局数组

时间:2013-09-18 16:51:28

标签: php arrays codeigniter

我想要一个可以通过控制器功能访问的全局数组,它们可以添加或删除任何带有特定键的项目。我该怎么做呢?我已将自定义控制器设为“globals.php”并将其添加到自动加载库中。

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  $notification_array = array();
  $config['notification'] = $notification_array;
?>

控制器上的以下功能应该将新项添加到我的数组

function add_data(){
   array_unshift($this->config->item('notification'), "sample-data");
}

add_data添加到全局数组后,每当从客户端调用以下函数时,它应该将更新的数组提供给客户端。

function send_json()
{
   header('content-type: application/json');
   $target = $this->config->item('notification');
   echo json_encode($target);
}

但是我的客户端总是得到空数组。我怎样才能做到这一点?请帮忙。

3 个答案:

答案 0 :(得分:1)

嗨利用OOP,就像这样

//将MY_Controller.php放在核心目录

class MY_Controller extends CI_Controller{

  public $global_array = array('key1'=>'Value one','key2'=>'Value2'):

   public function __construct() {
        parent::__construct();
    }

}

//页面控制器

class Page extends MY_Controller{

public function __construct() {
            parent::__construct();
        }

function send_json()
{
   header('content-type: application/json');
   $target = $this->global_array['key1'];
   echo json_encode($target);
}

}

答案 1 :(得分:1)

我提出的一个解决方案是使用会话,它易于使用,而且“快速”需要进行一些基准测试。

当我评论上面/下面的两个答案时,你不可能在不同的控制器中获得相同的数据,因为每个请求都被“重置”,并且要到达不同的控制器,你至少需要重新加载页面。 (注意,即使是AJAX调用也会提出新请求)

请注意,会话受大小限制,您有4kb的限制(CodeIgniter将会话存储为Cookie)但等待,有方法,将它们存储在DB中(允许这个转到配置文件并打开它{{ 1}} +创建表格,你会发现更多here

好吧让我们自己回答答案,据我所知你试过extending所有你的控制器,如果没有,并在核心/ MY_Controller.php文件中放置一些代码 如下:

$config['sess_use_database']    = TRUE;

你还需要这几个函数,它们是自我解释的,所有这些都是公共的,所以你可以在任何由MY_Controller.php扩展的控制器中自由使用它们,就像这样

private function _initJSONSession() { //this function should be run in MY_Controller construct() after succesful login, $this->_initJSONSession(); //ignore return values $json_session_data = $this->session->userdata('json'); if (empty($json_session_data )) { $json_session_data['json'] = array(); //your default array if no session json exists, //you can also have an array inside if you like $this->session->set_userdata($ses_data); return TRUE; //returns TRUE so you know session is created } return FALSE; //returns FALSE so you know session is already created }

$this->_existsSession('json');

最有趣的功能是public function _existsSession( $session_name ) { $ses_data = $this->session->userdata( $session_name ); if (empty( $ses_data )) return FALSE; return TRUE; } public function _clearSession($session_name) { $this->session->unset_userdata($session_name); } public function _loadSession($session_name) { return (($this->_existsSession( $session_name )) ? $this->session->userdata($session_name) : FALSE ); } ,这种自我解释我花了一段时间才能完全理解会话本身,好几句话你需要得到(加载)会话中的数据,做带有它的东西([CRUD]喜欢添加新数据,或者删除一些),然后在同一个会话中放回( REWRITE )所有数据。


让我们举例:

请记住,会话就像2d数组(我自己使用4 + 5d数组)

_loadSession()

$session['session_name'] = 'value';

所以在你使用的会话中编写新的(重写)东西

$session['json'] = array('id' => '1', 'name' => 'asok', 'some_array' => array('array_in_array' => array()), 'etcetera' => '...');

如果您想使用自己的函数{ $session_name = 'json'; $session_data[$session_name] = $this->_loadSession($session_name); //manipulate with array as you wish here, keep in mind that your variable is $session_data[$session_name]['id'] = '2'; // also keep in mind all session variables are (string) type even (boolean) TRUE translates to '1' //or create new index $session_data[$session_name]['new_index'] = FALSE; // this retypes to (string) '0' //now put session in place $this->session->set_userdata($session_data); } ,则需要执行此操作

  1. 你需要先将一些数据传递给它add_data()
  2. 例如:add_data($arr = array(), $data = ''){}

    array_unshift( $arr, $data );

    就是这样。

答案 2 :(得分:0)

您可以为每个控制器添加“全局”数组。

在控制器的顶部:

public $notification_array = array();

然后在您将使用的不同功能中访问它:

$this->notification_array;

因此,如果您想向其添加项目,您可以这样做:

$this->notification_array['notification'] = "Something";
$this->notification_array['another'] = "Something Else";