За последние 24 часа нас посетили 23032 программиста и 1227 роботов. Сейчас ищут 673 программиста ...

Как добавлять новые ключ=>значение в массив программно?

Тема в разделе "PHP для новичков", создана пользователем Andriy, 30 апр 2011.

  1. Andriy

    Andriy Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    10
    Симпатии:
    0
    Добрый день!

    Задача:
    1. создать ассоциативный массив (это понятно)
    2. в новый ассоциативный массив передать первый элемент типа ключ=>значение (это тоже понятно)
    3. далее программно необходимо пополнять ассоциативный массив новыми элементами (ключ=>значение); простое присваивание типа $array = array(ключ=>значение) или $array['key'] = value не подходит. функции типа array_push и так далее не подходят, так как нужно пополнять массив новыми элементами ключ=>значение, а не просто заносить значение (value).

    почему не работает такая конструкция:

    PHP код:
    PHP:
    1. $array = (!isset($array) ? array($key => $value) : $array+= array($key => $value));
    в результате ее работы исполняется только первая часть - $array = array($key => $value), а дальнейшее пополнение массива ($array+= array($key => $value))) не происходит.

    Не работает и такая конструкция:

    PHP код:
    PHP:
    1.  
    2. <?php  
    3. // просто пример
    4.  
    5. $ar_1 = array('a',' b','c');
    6. $ar_2 = array('d',' e','i');
    7. $ar_3 = array('w',' m','n');
    8.  
    9. $num = rand(0,2);
    10.  
    11. switch ($num) :
    12.   case 0 : { $key = 'пример №1'; $value = $ar_1; }
    13.   break;
    14.   case 1 : { $key = 'пример №2'; $value = $ar_2; }
    15.   break;
    16.   case 2 : { $key = 'пример №3'; $value = $ar_3; }
    17.   break;
    18. endswitch;
    19.  
    20. $array[] = array($key => $value);
    21. ?>
    22.  
    В результате получаем в массиве только один элемент (ключ-значение), а пополнения в дальнейшем нет. только перезаписывание первого элемента новым.

    Буду благодарен за любые идеи.

    Спасибо
     
  2. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    PHP:
    1. <pre>
    2. <?PHP
    3.  
    4. // 1. создать ассоциативный массив (это понятно)
    5.  
    6. $array = array();
    7.  
    8. //2. в новый ассоциативный массив передать первый элемент типа ключ=>значение (это тоже понятно)
    9.  
    10. $key = 'key1';
    11. $value = 'value1';
    12.  
    13. $array[$key] = $value;
    14.  
    15. //3. далее программно необходимо пополнять ассоциативный массив новыми элементами (ключ=>значение);
    16.  
    17. $key = array ('mkey1','mkey2','mkey3','mkey4');
    18. $value = array ('mvalue1', 'mvalue2', 'mvalue3', 'mvalue4');
    19.  
    20. for ($i = 0; $i<count($key); $i++) {
    21.     $array[$key[$i]] = $value[$i];
    22. }
    23.  
    24. print_r ($array);
     
  3. Andriy

    Andriy Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    10
    Симпатии:
    0
    спасибо, это отличное решение есои заранее известны и ключи и значения. а у меня задача несколько иная:
    по ходу выполнения программы создаюся пары (ключ-значение) мне необходимо их вносить последовательно в некий массив (в конец или начало без разницы). например,
    массив = (ключ1-значение1, ключ2-значение2 и так далее), то есть все время пополняя массив новыми элементами.

    приведенный выше пример - просто моделироывание ситуации и только.

    спасибо
     
  4. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    если вам все ясно тогда детальный алгоритм

    PHP:
    1. <?php
    2.  
    3.  ## генерируем $key
    4. ...
    5.  
    6.  ## генерируем $value
    7. ...
    8.  
    9. ## записываем в массив новый элемент
    10.  
    11.  $array[$key] = $value;
    12. ...
    13.  
    14.  ## генерируем $key
    15. ...
    16.  
    17.  ## генерируем $value
    18. ...
    19.  
    20. ## записываем в массив новый элемент
    21.  
    22.  $array[$key] = $value;
    23. ...
    24.  ## генерируем $key
    25. ...
    26.  
    27.  ## генерируем $value
    28. ...
    29.  
    30. ## записываем в массив новый элемент
    31.  
    32.  $array[$key] = $value;
    33. ...
    34.  ## генерируем $key
    35. ...
    36.  
    37.  ## генерируем $value
    38. ...
    39.  
    40. ## записываем в массив новый элемент
    41.  
    42.  $array[$key] = $value;
    43. ...
    44.  
    45. ##просмотр результата
    46. print_r ($array);
     
  5. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    В PHP элемент в массив добавляют обычно так:
    имя массивах[индекс элемента]=значение элемента;
    При этом неважно- индекс элемента это строка(для ассоциативных массивов) или целое число для числовых массивов. Так что можешь добавлять так

    PHP:
    1.  
    2. $array[$key]=$value;
    3.  
     
  6. Andriy

    Andriy Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    10
    Симпатии:
    0
    тогда почему моя модель не работает, ведь принцип же тот же?

    PHP:
    1.  
    2.  <?php  
    3.  // просто пример
    4.  
    5.  $ar_1 = array('a',' b','c');
    6.  $ar_2 = array('d',' e','i');
    7.  $ar_3 = array('w',' m','n');
    8.  
    9.  $num = rand(0,2);
    10.  
    11.  switch ($num) :
    12.    case 0 : { $key = 'пример №1'; $value = $ar_1; }
    13.    break;
    14.    case 1 : { $key = 'пример №2'; $value = $ar_2; }
    15.    break;
    16.    case 2 : { $key = 'пример №3'; $value = $ar_3; }
    17.    break;
    18.  endswitch;
    19.  
    20.  $array[$key] = $value;
    21.  ?>
    по идее массив должен пополняться, а он опять протсо перезаписывает первый элемент.

    спасибо.
     
  7. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    я вас не понимаю, в вашем коде черным по белому написано что вы определяете 1 элемент массива. Какие там еще могут быть элементы , кроме первого?
     
  8. Andriy

    Andriy Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    10
    Симпатии:
    0
    тогда, извините, вы не поняли меня.

    с первым элементом в массиве все здорово. он создается без проблем, но потом по ходу выполнения сценария в этот же массив необходимо записывать новые значение ключ-значение и в этом то вся проблема. если можете подскажите реальное ее решение.

    спасибо за любую помощь
     
  9. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    ЛЫКО-МОЧАЛО - НАЧИНАЙ СНАЧАЛА

    погу посоветовать вам вывести ваш массив $array из вашего кода фукцией print_r
    и на этом все .я сделал все что мог, ситуация безнадежна.
     
  10. Andriy

    Andriy Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    10
    Симпатии:
    0
    В первом своем посте я очень четко описал задачу:

    Задача:
    1. создать ассоциативный массив (это понятно)
    2. в новый ассоциативный массив передать первый элемент типа ключ=>значение (это тоже понятно)


    и с первым элементом вопроос нет, есть вопросы как добавлять следующие пары в ассоциативный массив.

    уже выводил, там запись первого элемента и все.

    спасибо
     
  11. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
  12. Andriy

    Andriy Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    10
    Симпатии:
    0
    нет у бога решения просить не будем, решение должно быть. может все же кто-то поможет из именитых мастеров php?

    спасибо
     
  13. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Andriy
    к этому могут присоединиться абсолютно все программисты и не только именитые. Поскольку это не то, что ты хочешь, значит твоя проблема несколько иная, чем ты ее описал.
    Вот смотри-я записываю твой код в отдельный файл скрипта и запускаю его в браузере.
    У меня в $array один всего элемент.
    Обновляю страницу- у меня снова в $array один всего элемент.
    Обновляю еще раз страницу- у меня опять в $array один всего элемент.
    Теперь вопрос:
    ты хочешь чтобы после третьего выполнения скрипта в массиве было 3 элемента?
     
  14. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    интересно почему не подходит?

    можешь привести пример массива, который хочешь получить в итоге?
     
  15. Andriy

    Andriy Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    10
    Симпатии:
    0
    конечно, я уже из поста в пост описываю одно и тоже.

    есть переменные ключ и значение, которым по ходу выполнения сценария присваиваются разные значение.
    Внимание : одна переменная ключ и одна переменная значение!

    далее создаем массив,
    как добавить первую пару (ключ1-значение1) мне понятно - проблем нет,
    а вот далее нужно каждую новую пару из переменных ключа и значания сохранять в ассоциированном массиве.

    массив = (ключ1-значение1, ключ2-значание2 и так далее)

    спасибо за любую помощь!
     
  16. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    ёпта))
    $arr_Array[$str_Key] = $mix_Value;

    пример:
    $str_Key = 'testkey';
    $arr_Array = array();
    for($i=1; $i<=10; $i++){
    $arr_Array[$str_Key.$i] = $i;
    }
    var_dump($arr_Array);

    массив получается аналогичный array('testkey1'=>1,'testkey2'=>2,...,'testkey10'=>10);
    ps: я прочитал всю ветку и последний пост. не нужно гнать, просто попробуй.
     
  17. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Так тебе нужно добавлять элементы в сессионную переменную
    PHP:
    1.  
    2. <?php
    3. if(!isset($_SESSION['array']))
    4. {
    5.     $_SESSION['array']=array();
    6. }
    7.   // просто пример
    8.  
    9.   $ar_1 = array('a',' b','c');
    10.   $ar_2 = array('d',' e','i');
    11.   $ar_3 = array('w',' m','n');
    12.  
    13.   $num = rand(0,2);
    14.  
    15.   switch ($num) :
    16.    case 0 : { $key = 'пример №1'; $value = $ar_1; }
    17.    break;
    18.    case 1 : { $key = 'пример №2'; $value = $ar_2; }
    19.    break;
    20.    case 2 : { $key = 'пример №3'; $value = $ar_3; }
    21.    break;
    22.   endswitch;
    23.  
    24.   $_SESSION['array'][$key] = $value;
    25.   ?>
    26.  
     
  18. Andriy

    Andriy Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    10
    Симпатии:
    0
    titch отличное добавление, если заранее известна длина массива, в моем случае она НЕИЗВЕСТНА!

    я дополнил код:

    PHP:
    1.  
    2. <?php
    3.  
    4.  if(!isset($_SESSION['array']))
    5.  {
    6.      $_SESSION['array']=array();
    7.  }
    8.    // просто пример
    9.    
    10.    $ar_1 = array('a',' b','c');
    11.    $ar_2 = array('d',' e','i');
    12.    $ar_3 = array('w',' m','n');
    13.    
    14.    $num = rand(0,2);
    15.    
    16.    switch ($num) :
    17.    case 0 : { $key = 'пример №1'; $value = $ar_1; }
    18.    break;
    19.    case 1 : { $key = 'пример №2'; $value = $ar_2; }
    20.    break;
    21.    case 2 : { $key = 'пример №3'; $value = $ar_3; }
    22.    break;
    23.    endswitch;
    24.    
    25.    $_SESSION['array'][$key] = $value;
    26.    $array[] = $_SESSION['array'];
    27.    print_r($array);
    28.    ?>
    29.  
    и вот что получил:

    Код (Text):
    1.  
    2. Array ( [пример №1] => Array ( [0] => a [1] => b [2] => c ) [0] => Array ( [пример №1] => Array ( [0] => a [1] => b [2] => c ) [0] => Array ( [пример №1] => Array ( [0] => a [1] => b [2] => c ) [0] => ) ) [пример №2] => Array ( [0] => d [1] => e [2] => i ) [1] => Array ( [пример №1] => Array ( [0] => a [1] => b [2] => c ) [0] => Array ( [пример №1] => Array ( [0] => a [1] => b [2] => c ) [0] => Array ( [пример №1] => Array ( [0] => a [1] => b [2] => c ) [0] => ) ) [пример №2] => Array ( [0] => d [1] => e [2] => i ) [1] => Array *RECURSION* ) )
    что-то много повторяющихся элементов, вместо (ключ1-значение1, ключ2-значение2, ключ3-значение3)

    или что-то нужно поправить?

    спасибо
     
  19. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    какая к чертям собачьим длина массива? о_О
    у меня ни одна из итераций не зависит ни от предыдущей, ни от следующей. тебе уже все показали конструкцию, которая полностью автономна. чего огрызаешься?
     
  20. Andriy

    Andriy Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    10
    Симпатии:
    0
    во-первых я не огрызаюсь,
    во-вторых смотрите сами:

    for($i=1; $i<=10; $i++) - ваш код

    длина массива равна 10, у меня не известна, создается в процессе выполнения скрипта.

    в третьих единственное что-то похожее на решение предложил runner, но я ще мало знаком с подобным использованием ссесий и хотел бы продолжить с ним диалог как поправить код, чтобы в масстве сохранялись сгенерированные переменные ключей и значений.

    спасибо
     
  21. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    сессии тут вообще ни при чём. циклы - тоже. боюсь, если я вам напишу вот так:
    PHP:
    1. <?
    2. $arr_Array = array();
    3. $res = mysql_query('SELECT key, value FROM tab_arr WHERE value>0');
    4. while($row = mysql_fetch_assoc($res)){
    5.     $str_Key = $row['key'];
    6.     $mix_Value = $row['value'];
    7.     $arr_Array[$str_Key] = $mix_Value;
    8. }
    9. var_dump($arr_Array);
    вы мне напишете, что у вас структура базы другая, а еще у вам нужны значения меньше 3, а не больше нуля, и, наверняка, у меня еще где-то опечатка и вообще, если скопировать этот код, то он не работает.
     
  22. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    скорее, "единственное, в чём я смог увидеть решение"
     
  23. Andriy

    Andriy Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    10
    Симпатии:
    0
    titch
    :) нет вы все нормально пишете, просто у меня не ставится задача сохранять эти данные в базе данных, я хочу сохранить их в ассоциативном массиве и вроде уже нащупалось решение runner, но его нет на форуме или он не видит этой ветки, в его решении есть идея, но я получаю пока там много лишего и его надо убрать, но как или как то по другому выводить результат после сессии.

    спсибо вам за участие.
     
  24. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    а доцент тупой
     
    zlojnaxa нравится это.