PDA

View Full Version : ساخت سیشن در تابع



foreach
چهارشنبه 18 دی 1392, 16:04 عصر
سلام دوستان
چطور میشه یه سیشن رو با index های زیاد در تابع ساخت ؟


public function set($index,$value)
{
session_start();
$_SESSION[$index] = $value;
}

در کد بالا فقط میشه یک index اضافه کرد حالا میخواستم ببینم چطور میشه که مثل کد زیر بشه انجامش داد


$_SESSION[$index][$index1][$index2] = $value;

تشکر

MRmoon
چهارشنبه 18 دی 1392, 17:09 عصر
<?php
/**
* @author Mohammad Mahdi Gholamian <agham24@yahoo.com>
*/
Class SessionUsageExample
{
/**
* Start sessions.
*
* Before use other methods call this.
*/
function start()
{
session_start();
}
/**
* Get a session.
*
* For example if $index is "1.2.3.4" method return $_SESSION[1][2][3][4].
*
* @param string $index
*
* @return mixed
*/
function get($index)
{
$index = $this->prepareNamespaces($index);
return eval('$_SESSION' . $index . ';');
}
/**
* Set new session.
*
* @param string $index
* @param string $value
* @return void
*/
function set($index, $value)
{
$index = $this->prepareNamespaces($index);
return eval('$_SESSION' . $index . '="' . $value . '";');
}
/**
* Flush a session.
*
* @param string $index
* @return void
*/
function flush($index)
{
$index = $this->prepareNamespaces($index);
return eval('unset($_SESSION' . $index . ');');
}
/**
* Flush all sessions.
*
* @return void
*/
function flushAll()
{
$_SESSION = array();
}
/**
* Prepare namespaces.
*
* "n1.n2.n3" to ['n1']['n2']['n3']
*
* @param string $index
* @return string
*/
function prepareNamespaces($index)
{
if(strpos($index, '.') === false) {
return "['" . $index . "']";
}

$splitedIndex = explode('.', $index);
$return = '';
foreach($splitedIndex as $namespace) {
$return .= "['" . $namespace . "']";
}
return $return;
}
}
// Create object
$s = new SessionUsageExample;
// Start sessions
$s->start();
// Flush all sessions.
$s->flushAll();
// Set sessions.
$s->set('index', 'Wahooo!');
$s->set('namespace1.index', 'Wahooohoo!');
$s->set('namespace1.namespace2.index', 'Wahooohoohoo!');
$s->set('namespace1.namespace2.namespace3.index', 'Wahooohoohoohoo!');
//Print $_SESSION information for see class work!
print_r($_SESSION);
?>

اينو من قبلا نوشته بودم تمريني.

با eval كار ميكنه.

foreach
چهارشنبه 18 دی 1392, 18:51 عصر
البته استفاده از eval مشکلات امنیتی زیادی رو به همراه داره.

می تونید از این کلاس Helper به جاش استفاده بکنید (یه چیزی مثل Helper های فریم ورک Laravel هست):


class Arr {
/**
* Get array value by key (ex: array.key1.key2)
*
* @param array
* @param string
* @param mixed | null
* @return array
*/
public static function get($key, &$array, $default = null) {
// Split key by dot sign
$keys = array_filter(explode('.', $key));
// Iterate array and go in deep by key
foreach($keys as $key) {
if(array_key_exists($key, $array)) {
$value = $array[$key];
} else {
$value = $default;
break;
}
}

return $value;
}
/**
* Set array value by key (ex: array.key1.key2)
*
* @param array
* @param string
* @param string
* @return array
*/
public static function set($key, $value, &$array, $replace = true) {
// Split key by dot sign
$keys = array_filter(explode('.', $key));
// Set the value by key
$count = count($keys);
foreach($keys as $key) {
if(array_key_exists($key, $array) && $replace) {
$array[$key] = (1 == --$count) ? $value : array();
}
}

return $array;
}
}
کد شمارو تست کردم اما متاسفانه آرایه ها به این صورت


Array ( [user] => example [lname] => example )

در صورتی که من اینطور میخواستم


Array ( [user] => Array ( [fname] => example [lname] => example ) )

در هر صورت در فریم ورک اورانیوم تابعی رو پیدا کردم



static function arraySet( &$array , $key , $value ){
$keys = explode( '.' , $key );

while ( count( $keys ) > 1 ){
$key = array_shift($keys);

if ( ! isset( $array[$key] ) or ! is_array( $array[$key] ) )
$array[$key] = [];

$array =& $array[$key];
}

$array[ array_shift( $keys ) ] = $value;
return true;
}

MRmoon
چهارشنبه 18 دی 1392, 20:11 عصر
بله.

ميتونيد كل اون كلاس ArrayHelper رو استفاده كنيد.