2013-07-06 2 views
1

Создаю массив сеансов, который будет использоваться через сайт для каждого пользователя. Как только пользователь меняет настройки, настройки массива сеанса меняются вместе с ним.Поиск значения в массиве в массиве и замена - PHP

создать массив сеанса на нагрузку до страницы:

if (!isset($_SESSION['controller'])) 
{ 
    $_SESSION['controller'] = array(
     'color' => array(
      'shell' => 'none', 
      'graphic-color' => 'none', 
      'part-color' => 'none' 
     ), 
     'graphics' => array (
      'text' => 'none', 
      'text-font' => 'none', 
      'text-style' => 'none', 
      'graphic' => 'none', 
      'part' => 'none' 
     ) 

    ); 
} 

После того, как пользователь изменяет настройки, используя вызов Ajax, я называю .php файл для изменения, которые когда-либо связанный параметр, предполагают, чтобы быть изменена:

JS:

function changeSetting(what, to) 
{ 
    $.ajax({ 
     url: "../wp-content/themes/twentytwelve/controller/php/controllerArrayMody.php", 
     type: "POST", 
     data: { 
      'what' : what, 
      'to' :to 
     }, 
     success: function() { 

     } 
    }); 
} 

what будет содержать 'оболочку' или 'графический-цвет' и т.д. ... to будет содержать значение, что s Предположим, что none изменится.

Теперь из их вот мой код у меня есть для его модификации:

$changeWhat = $_POST['what']; 
$to = $_POST['to']; 
$newArray = $_SESSION['controller']; 

$key = array_search($changeWhat , $_SESSION['controller']); // returns the first key whose value is changeWhat 
$newArray[$key][0] = $to; // replace 

$_SESSION['controller'] = $newArray; 

Вот результат:

Array ([color] => Array ([shell] => none [graphic-color] => none [part-color] 
=> none) [graphics] => Array ([text] => none [text-font] => none [graphic] => 
none [part] => none) [0] => Array ([0] => Red-Metallic.png)) 

Мой вопрос, что я делаю неправильно, что это добавление к конец массива вместо замены, скажем [shell] значение to, которое позволяет сказать, что это Img.test.png

+0

'$ newArray [$ клавишу [0]]' –

+0

Нет, не работает, он все равно добавляет к концу массива. мой вывод будет ... 'array (..) [0] => Red-Metallic.png [] => Gold-Metallic.png)' –

+0

'var_dump ($ key)' посмотреть, что он содержит и как он может влияет на '$ _SESSION ['controller']' –

ответ

1

Вот решение:

$changeWhat = $_POST['what']; // suppose it's 'graphics-color' 
$to = $_POST['to']; 
$newArray = $_SESSION['controller']; 

$changeWhatKey = false; // assume we don't have changeWhat in $newArray 
// next, iterate through all keys of $newArray 
foreach ($newArray as $group_name => $group_options) { 
    $changeWhatKeyExists = array_key_exists($changeWhat, $group_options); 
    // if we have key $changeWhat in $group_options - then $changeWhatKeyExists is true 
    // else it equals false 
    // If we found the key - then we found the group it belongs to, it's $group_name 
    if ($changeWhatKeyExists) { 
     $changeWhatKey = $group_name; 
     // no need to search any longer - break 
     break; 
    } 
} 

if ($changeWhatKey !== false) 
    $newArray[$changeWhatKey][$changeWhat] = $to; // replace 

$_SESSION['controller'] = $newArray; 
+0

Спасибо, человек, работает идеально! –

0

aslong as your $to - это массив, я бы просто сделал:

$changeWhat = $_POST['what']; 
$to = $_POST['to']; 
$_SESSION['controller'][$changeWhat] = $to; 

Это не проверено, но я надеюсь, что это поможет! :)

0

Вы можете использовать функцию array_walk_recursive в этом случае

<?php 
    $what = $_POST["what"]; 
    $to = $_POST["to"]; 

    function my_callback(&$value, $key, $userdata) { 
    if ($key === $userdata[0]) { 
     $value = $userdata[1]; 
    } 
    } 

    array_walk_recursive($_SESSION["controller"], "my_callback", array($what, $to)); 

    print_r($_SESSION["controller"]); 
?> 
Смежные вопросы