За последние 24 часа нас посетили 17842 программиста и 1700 роботов. Сейчас ищут 1533 программиста ...

Сериализация автомассивов и запись в БД.

Тема в разделе "PHP для новичков", создана пользователем Demon, 21 ноя 2006.

  1. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Demon
    можно так:
    PHP:
    1.  
    2. <?
    3. $array = array(
    4.           "one" => "один",
    5.           "two" => ""
    6.           );
    7.  
    8. foreach($array as $index => $value)
    9. {
    10.     if( $value == "" )
    11.     {
    12.         unset($array[$index]);
    13.     }
    14. }
    15.  
    16. print_r($array);
    17.  
    и вот так:
    PHP:
    1.  
    2. <?
    3. $array = array(
    4.           "one" => "один",
    5.           "two" => "",
    6.           "three" => "",
    7.           "four" => "четыре"
    8.           );
    9.  
    10. while($key = array_search('', $array))
    11. {
    12.     unset($array[$key]);
    13. }
    14.  
    15. print_r($array);
    16.  
     
  2. Demon

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

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Hight: Большое спасибо.:wink:
     
  3. Demon

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

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    А есть еще варианты удаления пустых ключей из массива? А то оба примера, которые привел Hight глючат.. :(
     
  4. Anonymous

    Anonymous Guest

    Да ну? И как же?
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Горбунов Олег
    Выскакивает ошибка в коде (в ДНК-коде) :)
     
  6. Demon

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

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Допустим, в форме есть 5 инпутов с value="Text". В качестве переменных для всех инпутов автомассив. После отправки данных, если в инпутах по-прежнему пресутствует слово "Text", оно c помощью str_replace заменяется на пустое значение, потом автомассив сериализуется и записывается в БД.
    После извлечения сериализованного массива из БД, и применения к нему сначала unserialize, а потом кода, который посоветовал Hight, пустые ключи, которым должно было соответствовать пустое значения после применения к инпутам str_replace, не удаляются. А вот если при отправке данных стереть все слова "Text" из инпутов, и потом применить unserialize и код для удаления ключей - ключи спокойно удаляются..:(
     
  7. Mavir

    Mavir Guest

    Перед удалением элементов массивов, посмотри какой массив на самом деле обрабатываешь - print_r($ar);
     
  8. Demon

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

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Массив обрабатываю именно тот, который нужен..:(
     
  9. Mavir

    Mavir Guest

    Я имею ввиду посмотреть его значения. Может там и нет пустых значений.
     
  10. Demon

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

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Есть. :(
    PHP:
    1. <?
    2. [0] => 1
    3. [1] => 2
    4. [2] =>
    5. [3] =>
    6. [4] => 5
    7. );
    8. ?>
     
  11. Anonymous

    Anonymous Guest

    Код. Весь код.
     
  12. Demon

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

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    PHP:
    1.  
    2. <?
    3. $number = $_POST['number'];
    4. $linksname = $_POST['linksname'];
    5. $linkshref = $_POST['linkshref'];
    6. $submit = $_POST['submit'];
    7.  
    8. switch($albums):
    9. case("ed"):
    10. if($submit) {
    11. mysql_connect("localhost", "root", "1") or die("Невозможно подключиться к БД!");
    12. mysql_select_db("1") or die("БД не существует!");
    13. mysql_query("INSERT INTO audio()") or die("Невозможно произвести запись результатов!");
    14. }
    15. include("edit/selection.inc");
    16. if($noa && $selection <= 31) {
    17. mysql_connect("localhost", "root", "") or die("Невозможно подключиться к БД!");
    18. mysql_select_db("1") or die("БД не существует!");
    19. $sql = mysql_query("SELECT * FROM audio WHERE id = '$selection'");
    20. while($row = mysql_fetch_array($sql)) {
    21. $albumarray = unserialize($row["album"]);
    22. $songarray = unserialize($row['linksname']);
    23. $hrefsarray = unserialize($row['linkshref']);
    24. include("edit/head.inc");
    25. foreach ($albumarray as $key => $value) {
    26. echo "<input type=\"text\" value=\"$value\" />";
    27. }
    28. include("edit/center.inc");
    29. if($songarray == null or $hrefsarray == null) {
    30. }
    31. else {
    32. include("edit/bottom.inc");
    33. echo "<div id=\"songlist\">";
    34. while($key = array_search('', $songarray) and $secondkey = array_search('', $hrefsarray))
    35. {
    36.    unset($songarray[$key]);
    37.      unset($hrefsarray[$secondkey]);
    38. }
    39. foreach ($songarray as $key => $song) {
    40. $song = stripslashes($song);
    41. echo "<input name=\"linkname[]\" value=\"$song\">";
    42. }
    43. echo "</div>";
    44. foreach ($hrefsarray as $key => $href) {
    45. $href = stripslashes($href);
    46. echo "<input name=\"linkname[]\" value=\"$href\">";
    47. }
    48. echo "</div>";
    49. }
    50. echo "
    51. <input type=\"submit\" id=\"submit\" name=\"submit\" value=\"Отправить...\">
    52. </div>
    53. </form>
    54. </body>
    55. </html>";
    56. }
    57. }
    58. break;
    59.  
    60. case("add"):
    61. if($submit) {
    62. include_once ("./notice/info.html");
    63. echo "<br />";
    64. $_POST['linkshref'] = str_replace("Ссылка..", "", $_POST['linkshref']);
    65. $_POST['linksname'] = str_replace("Имя песни..", "", $_POST['linksname']);
    66. $album = addslashes(serialize($_POST['addalbum']));
    67. $linkname = addslashes(serialize($_POST['linksname']));
    68. $linkhref = addslashes(serialize($_POST['linkshref']));
    69. mysql_connect("localhost", "root", "1") or die("Невозможно подключиться к БД!");
    70. mysql_select_db("1") or die("БД не существует!");
    71. mysql_query("INSERT INTO audio(album, linksname, linkshref) VALUES ('$album', '$linkname', '$linkhref')") or die($error = true);
    72. $sql = mysql_query("SELECT album FROM audio");
    73. }
    74. include("add/add.htm");
    75. echo "<div id=\"songlist\">";
    76. for($i=1; $i<=$number; $i++) {
    77. echo "<input name=\"linksname[]\" value=\"&nbsp;Имя песни..\">";
    78. }
    79. echo "</div>";
    80. echo "<div id=\"linkslist\">";
    81. for($i=1; $i<=$number; $i++) {
    82. echo "<input name=\"linkshref[]\" value=\"&nbsp;Ссылка..\">";
    83. }
    84. echo "</div>";
    85. echo "</div>
    86. <input type=\"submit\" id=\"submit\" name=\"submit\" value=\"Отправить...\">
    87. </form>
    88. </body>
    89. </html>";
    90. break;
    91. endswitch;
    92. ?>
    93.  
     
  13. Mavir

    Mavir Guest

    Это вот этот строки удаляют элементы?
    Код (Text):
    1.  
    2.       while($key = array_search('', $songarray) and $secondkey = array_search('', $hrefsarray))
    3.       {
    4.         unset($songarray[$key]);
    5.         unset($hrefsarray[$secondkey]);
    6.       }
    Тогда не стоит говорить, что код Hight не рабоает. Это Ваш не работает. С утра не хочется разбираться с логическим выражением, еще не проснулся, но у Вас точно нарушен приоритет вычислений.
     
  14. Anonymous

    Anonymous Guest

    я бы сказал, логика условия нарушена...
     
  15. Demon

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

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    А что разве так нельзя делать?..Чтобы два раза не писать while(..) {}
    Код (Text):
    1. while($key = array_search('', $songarray) and $secondkey = array_search('', $hrefsarray))
     
  16. Mavir

    Mavir Guest

    Наверное, с утра я погорячился на счет приоритетов, но все равно бы расставил скобки.

    А теперь начинаем изучать логику на примерах. Demon, сколько раз выполнится цикл, если, например, в массиве $songarray будут 5 элементов с пустыми полями, а $secondkey не будет пустых значений?

    P.S. Я бы отказался от использования второго варианта Hight, потому что при больших массивах, где много пустых значений, это будет сильно тормозить. Ведь поиск в функции array_search осуществляется простым циклом, пусть даже и на машинных кодах. А если будет, например, массив даже из 100 элементов, из них 50 пустые и находятся в конце массива, то нужно будет выполнить что-то среднее (арифметическое или геометрическое) между 50*50 и 100*50 сравнений. В то время как по первому варианту Hight нужно будет сделать 100 сравнений.
     
  17. Mavir

    Mavir Guest

    Зачем есть раздельно суп, второе и компот, все равно в желудке все смешается :)
     
  18. Anonymous

    Anonymous Guest

    А я бы попробовал сделать через array_map — им можно обработать два массива одновременно, если так уж хочется. Либо array_walk тоже можно пройти.
     
  19. Demon

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

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Так пример с while работает (почти), как надо, только я не могу понять, почему не удаляются ключи, с пустыми значениями обработанных str_replace, инпутов.. После str_replace делаю print_r() обработанного массива - пустые ключи в нем присутствуют.. Мда..
     
  20. Anonymous

    Anonymous Guest

    «почти работает» == «не работает».
     
  21. Demon

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

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Ну а все-таки? Это глюк такой или так и должно быть?..
     
  22. Anonymous

    Anonymous Guest

    Это руки кривые.
     
  23. Anonymous

    Anonymous Guest

    PHP:
    1. <?php
    2. $a = array(
    3. '0' => '1',
    4. '1' => '2',
    5. '2' => '',
    6. '3' => '',
    7. '4' => '5',
    8. );
    9. foreach($a as $val) { if (!empty($val)) $b[]=$val; }
    10. print_r($b);
    11. ?>
     
  24. Demon

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

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    И что вы мне этим примером хотите показать?..
    Имеется:
    [​IMG]
    Вводим значения:
    [​IMG]
    Производим замену Имя песни.. и Ссылка.. на пустое значение с помощью str_replace, записываем в БД, потом достаем из нее сериализованные массив -> unserialize -> попытка удаления пустых ключей.
    Получаем:
    [​IMG]

    Имеется:
    [​IMG]
    Вводим значения:
    [​IMG]
    Записываем в БД, потом достаем из нее сериализованные массив -> unserialize -> попытка удаления пустых ключей.
    Получаем:
    [​IMG]
    :? :? :?

    print_r(массив, в котором была произведена замена с помощью str_replace)
    Код (Text):
    1.  
    2. <?
    3. Array (
    4. [0] => Текст
    5. [1] =>
    6. [2] => Текст 2
    7. ) ;
    8. ?>
    print_r(массив второго варианта, без str_replace)
    Код (Text):
    1. <?
    2. Array (
    3. [0] => Текст
    4. [1] =>
    5. [2] => Текст 2
    6. ) ;
    7. ?>
    Как видите, массивы одинаковые, однако ключи в первом случае не удаляются.
     
  25. Anonymous

    Anonymous Guest

    А чего вы таки пытаетесь добится?