За последние 24 часа нас посетили 52208 программистов и 1760 роботов. Сейчас ищут 896 программистов ...

Ассоциативный массив, сравнение вывод...

Тема в разделе "PHP для новичков", создана пользователем Panter7777, 23 дек 2010.

  1. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Добрый день!

    Моя задача массив $street переданного методом POST в формате :
    mt-12-2
    sv-14-3
    pr-19-5

    1.разбить на состовляющие по типу: mt sv pr (это будет массив ключей) и -12-2 -14-3 -19-5 (это будет массив значений)
    2.потом из этих двух массивов сделать один ассциат. массив вида:

    Array=("mt"=>"-12-2", "sv"=>"-14-3", "pr"=>"-19-5")

    3.В конечном итоге Сравнить это с готовым ассоц. массивом

    Array2=("ПР"=>"pr", "МТ"=>"mt", "СВ"=>"sv",)

    4.Ключи первго поменять на значения второго и занести их в базу!

    Сделал вот что :




    Код (Text):
    1. $street = $_POST['street'];
    2.  
    3.  
    4. $arr = array ("ПР"=>"pr", "МТ"=>"mt", "СВ"=>"sv",);
    5. //print_r($arr);
    6.  function changeCharacter($data)
    7. {
    8.         for ($i=0; $i<count($data); $i++){
    9.         $char = explode("\n", $data);}
    10.             foreach ($char AS $val) {
    11.             $char1 = preg_split("/-[0-9a-zA-zа-яА-Я]{1,}-[0-9]{1}$/", $val);
    12.             $char2 = preg_split("/^[a-zA-Z]{2,5}/", $val);
    13.                
    14.                         }          
    15.             $arr2 = array_combine($char1,$char2);
    16.             print_r($arr2);
    17.            
    18. };
    19. changeCharacter ($street);
    20.  
    21. print "<form action='' method='POST'>
    22.     <textarea name='street' cols='10' rows='5'></textarea>
    23.     <input type='submit' value='ОК' />
    24.     </form>";
    Ввожу в форму :
    mt-12-2
    sv-14-3
    А получаю Array ( [sv] => [] => -14-3 )
    Тоесть застрял на 2-м пункте не могу запихнуть все в аасоц. массив. ПОМОГИТЕ ПЛЗ
     
  2. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
  3. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Спасибо большое, кавычки убрал все заработало!!! А array_flip не совсем мне подходит или я простоне понял как его праельно можно использовать, но

    Функция array_flip() "пробегает" по массиву и меняет местами его ключи и значения. Исходный массив $arr не изменяется, а результирующий массив просто возвращается.
    Конечно, если в массиве присутствовали несколько элементов с одинаковыми значениями, учитываться будет только последний из них:

    Код (Text):
    1. $A=array("a"=>"aaa", "b"=>"aaa", "c"=>"ccc");
    2. $A=array_flip($A);
    3. // теперь $A===array("aaa"=>"b", "ccc"=>"c");
    Вроде как не то.
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Если есть одинаковые значения, то не подойдет, а если нет, то:

    PHP:
    1. <?php
    2. $street = $_POST['street'];
    3. $arr = array ("ПР"=>"pr", "МТ"=>"mt", "СВ"=>"sv",);
    4. $flipArr=array_flip($arr);
    5. echo $flipArr[$street];
     
  5. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    А как сравнить массив с массивом по такому принцпу. Ну дапустим есть такой список:

    pr
    mt
    sv
    ..... и таких 1000 штук и есть вот такой массив:
    $arr = array ("ПР"=>"pr", "МТ"=>"mt", "СВ"=>"sv", .... и та же 1000 шт.);


    Я через форму передаю список сразу всю 1000 шт.
    Код (Text):
    1. print "<form action='' method='POST'>
    2.    <input type='text' name='street[]' value='' />
    3.    <input type='submit' value='ОК' />
    4.    </form>";
    И оно должно сраснить и вывести мне уже не "pr, mt, sv", a "ПР, МТ, СВ, ....и тд "

    Вот это правельно name='street[]' ?
    или как это делается?
    И кстате повторений в массиве нет!!!
     
  6. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1)street[] можно использовать, если есть несколько полей ввода:
    HTML:
    1. <form action='' method='POST'>
    2.    <input type='text' name='street[]' value='' />
    3.    <input type='text' name='street[]' value='' />
    4.    <input type='text' name='street[]' value='' />
    5.    <input type='text' name='street[]' value='' />
    6.    <input type='submit' value='ОК' />
    7.    </form>
    Тогда значения попадут в массив street[].
    2)Если надо загрузить много значений, то не лучше ли загрузить файл и его распарсить?
    3)Если делать это через форму, то удобнее, как мне кажется, использовать textarea. В нее вводить значения через запятую (или любой другой разделитель).
    На сервере можно сделать $rezArr=array_intersect_key($arr, array_flip(explode(',', $_POST['street']));
     
  7. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Я так понимаю что код будет такой!

    Код (Text):
    1. $street = $_POST['street'];
    2.  
    3.  
    4. $arr = array ("ПР"=>"pr", "МТ"=>"mt", "СВ"=>"sv",);
    5. $rezArr=array_intersect_key($arr, array_flip(explode(',', $street)));
    6. echo $rezArr[$street];
    7.  
    8. print "<form action='' method='POST'>
    9.     <textarea name='street' cols='10' rows='5'></textarea>
    10.     <input type='submit' value='ОК' />
    11.     </form>";
    $rezArr=array_intersect_key($arr, array_flip(explode(',', $street))); -- это парсит по запятым???
     
  8. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    В echo нельзя передать массив.
     
  9. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Сделал так:
    Код (Text):
    1. $arr = array ("ПР"=>"pr", "МТ"=>"mt", "СВ"=>"sv",);
    2. $rezArr=array_intersect_key($arr, array_flip(explode(',', $street)));
    3. var_dump ($rezArr[$street]);
    4.  
    5.  
    6.  
    7. print "<form action='' method='POST'>
    8.     <textarea name='street' cols='10' rows='5'></textarea>
    9.     <input type='submit' value='ОК' />
    10.     </form>";
    ввожу в поле <textarea> mt, sv, pr - возвращает NULL (без пробелов тоже самое)
     
  10. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Что означает конструкция $rezArr[$street] ?
     
  11. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    С [$street] - я загнул, но var_dump ($rezArr); - при вводе в поле <textarea> mt, sv, pr - возвращает array(0) { }.
     
  12. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Сравнивать надо не ключи, а значения:
    Код (Text):
    1. $rezArr=array_intersect($arr, explode(',', $street));
    собственно var_dump каждого действия позволяет быстро найти ошибку.
     
  13. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Вообщем задача такая в целом!
    Есть список :
    mt-2-4
    mt-5a-2
    pr-29-5
    pr-5-19
    sv-45-2
    .................. аж ~1000! передаются через <textarea>

    Нужно в этот список записать в БД в виде:
    МТ-2-4
    MT-5a-2
    ПР-29-5
    ПР-5-19
    СВ-45-2
    ..................и тд.


    вот что сделано :

    Код (Text):
    1.  
    2. $street = $_POST['street'];
    3.  
    4. $arr = array ("ПР"=>"pr", "МТ"=>"mt", "СВ"=>"sv",);
    5. $rezArr=array_intersect_key($arr, array_flip(mb_ereg("^[a-zA-Z]{2,5}", (explode('\n', $street)))));
    6.  
    7. var_dump ($rezArr);
    8.  
    9.  
    10.  
    11. print "<form action='' method='POST'>
    12.     <textarea name='street' cols='10' rows='5'></textarea>
    13.     <input type='submit' value='ОК' />
    14.     </form>";


    тут типо я делаю explode('\n', $street) - для парса по разделителю "перенос на новую строчку"
    далее - mb_ereg("^[a-zA-Z]{2,5}", (explode('\n', $street)) - то что спарсили забераем первые буквы до "-"
    далее - array_flip(mb_ereg("^[a-zA-Z]{2,5}", (explode('\n', $street)))) - мы сравнивам то что отфильтровали с массивом $arr;
    только теперь как это вывести (сейчас хотябы на экран) в переменные что б записать в БД
     
  14. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Ээээ... Оно работает??

    1) не '\n' а "\n"
    2) mb_ereg не работает с массивами и не возвращает строк и массивов.
    3) Вроде уже решили что array_flip не нужен.
    4) http://ru.php.net/manual/en/function.strtr.php
     
  15. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    эххх нифига не выходит(((
     
  16. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Так придумал так:

    ввожу в поле <textarea> mt-12-2, sv-34-2, pr-19-5 - С новой строчки!
    на сервере нужно этот массив разобрать и превратить в ассоциативный по макету $key=mt $val=-12-2....."mt"=>"-12-2" и тд. И останеться только сравнить два ассоц. массива возможно даже array_flip'ом и поменять ключи $key=mt на $key=МТ!!!
    Логика правельная???
     
  17. jei

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

    С нами с:
    11 июн 2009
    Сообщения:
    542
    Симпатии:
    0
    if ($street == $key)
     
  18. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    В общем решил пойти по другому пути:
    Через <textarea> отправляю pr-12-2 mt-23-2 (каждый с новой строчки)

    Код (Text):
    1.  
    2. $street = $_POST['street'];
    3. //$arr = array ("ПР"=>"pr", "МТ"=>"mt", "СВ"=>"sv",);
    4.  
    5.  function changeCharacter($data)
    6. {
    7.         for ($i=0; $i<count($data); $i++)
    8.         $char = explode("\n", $data);
    9.        
    10.            foreach ($char AS $val)
    11.             $char1 = preg_split("/^[a-zA-Z]{2,5}/", $val);
    12.             $char2 = preg_split("/-[0-9a-zA-zа-яА-Я]{1,}-[0-9]{1}$/", $val);
    13.             $return[] = $char1."=>".$char2;
    14.             print_r ($return);
    15. }  
    16. changeCharacter ($street);
    17.  
    18. print "<form action='' method='POST'>
    19.     <textarea name='street' cols='10' rows='5'></textarea>
    20.     <input type='submit' value='ОК' />
    21.     </form>";
    на выходе получаю Array ( [0] => Array=>Array ) А хочу получить mt=>-12-2 mt=>-23-2....

    что бы потом загнать в ассоцю массив. Что не так я делаю, хотябы натолкните на мысль
     
  19. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Наконец-то я получаю два массива
    Код (Text):
    1.  function changeCharacter($data)
    2. {
    3.         for ($i=0; $i<count($data); $i++)
    4.         $char = explode("\n", $data);
    5.             foreach ($char AS $val) {
    6.             $char1 = preg_split("/-[0-9a-zA-zа-яА-Я]{1,}-[0-9]{1}$/", $val);
    7.             $char2 = preg_split("/^[a-zA-Z]{2,5}/", $val);
    8.                
    9. }
    10. };
    11. changeCharacter ($street);
    Осталось дело за маленьким сделать массив $char1 = key а $char2 = val - В новом ассоциативном масииве. Подскажите как?

    Как из двух простых массивов сделать один ассоц. массив????
     
  20. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    Давайте для начала попробуем

    $arr = array ("pr"=>"ПР", "mt"=>"МТ", "sv"=>"СВ",);
    $street = $_POST['street'];

    echo strstr($street, $arr);
     
  21. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Абсолютно ничего не происходит, ввожу в форму как ключи "mt", "pr" так и значения "МТ", "ПР"...
     
  22. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
  23. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Моя задача массив $street переданного методом POST в формате :
    mt-12-2
    sv-14-3
    pr-19-5

    1.разбить на состовляющие по типу: mt sv pr (это будет массив ключей) и -12-2 -14-3 -19-5 (это будет массив значений)
    2.потом из этих двух массивов сделать один ассциат. массив вида:

    Array=("mt"=>"-12-2", "sv"=>"-14-3", "pr"=>"-19-5")

    3.В конечном итоге Сравнить это с готовым ассоц. массивом

    Array2=("ПР"=>"pr", "МТ"=>"mt", "СВ"=>"sv",)

    Ключи первго поменять на значения второго и занести их в базу!

    Сделал вот что :




    Код (Text):
    1. $street = $_POST['street'];
    2.  
    3.  
    4. $arr = array ("ПР"=>"pr", "МТ"=>"mt", "СВ"=>"sv",);
    5. //print_r($arr);
    6.  function changeCharacter($data)
    7. {
    8.         for ($i=0; $i<count($data); $i++){
    9.         $char = explode("\n", $data);}
    10.             foreach ($char AS $val) {
    11.             $char1 = preg_split("/-[0-9a-zA-zа-яА-Я]{1,}-[0-9]{1}$/", $val);
    12.             $char2 = preg_split("/^[a-zA-Z]{2,5}/", $val);
    13.                
    14.                         }          
    15.             $arr2 = array_combine($char1,$char2);
    16.             print_r($arr2);
    17.            
    18. };
    19. changeCharacter ($street);
    20.  
    21. print "<form action='' method='POST'>
    22.     <textarea name='street' cols='10' rows='5'></textarea>
    23.     <input type='submit' value='ОК' />
    24.     </form>";
    Ввожу в форму :
    mt-12-2
    sv-14-3
    А получаю Array ( [sv] => [] => -14-3 )
    Тоесть застрял на 2-м пункте не могу запихнуть все в аасоц. массив. ПОМОГИТЕ ПЛЗ
     
  24. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Блин начинаю дебажить и не пойму где я провтыкиваю????

    Код (Text):
    1. function changeCharacter($data)
    2. {
    3.         for ($i=0; $i<count($data); $i++){
    4.         $char = explode("\n", $data);}
    5. echo "MASS";       
    6. print_r ($char);
    7.             foreach ($char AS $val) {
    8.             $char1 = preg_split("/-[0-9a-zA-zа-яА-Я]{1,}-[0-9]{1}$/", $val);
    9.             $char2 = preg_split("/^[a-zA-Z]{2,5}/", $val);
    10.  
    11.                         }
    12.                         echo "KEYS";       
    13. print_r ($char1)."<br>";
    14.             echo "VALS";       
    15. print_r ($char2);              
    16.             $arr2 = array_combine($char1,$char2);
    17.             print_r($arr2);
    18.            
    19. };
    20. changeCharacter ($street);
    Вот что выводит:
    Код (Text):
    1. MASSArray ( [0] => mt-12-2 [1] => pr-18-4 ) KEYSArray ( [0] => pr [1] => ) VALSArray ( [0] => [1] => -18-4 ) Array ( [pr] => [] => -18-4 )
     
  25. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Походу ошибка в регулярных выражениях, так как split работает только со строками... а я разбиваю массив.