За последние 24 часа нас посетили 201449 программистов и 2096 роботов. Сейчас ищет 1801 программист ...

НЕпонятка в массивах!!!

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

  1. Panter7777

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

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

    есть массив ($cur) в нем 2035 значений ( ....[2033] => РАД [2034] => СЕВ )) - это когда вывожу через print_r;//вывод всего массива
    если я вывожу только значения $cur = array_values($cur); print_r($cur)//вывод всех значений массива - выводит только 1970 значений (....[1968] => РАД [1969] => СЕВ )) так же если подсчитать count($cur) = 1970 значений.
    Куда куда деваються остальные???????

    Вот сам код:
    Код (Text):
    1.  
    2. <?php
    3.  
    4. ini_set('display_errors',1);
    5. error_reporting(E_ALL);
    6. $do = fopen('bububu.txt', "a+") or die ('Немогу открыть файл');
    7.  
    8. $tr = file('bububu.txt');
    9. $cu = implode($tr);
    10. //print_r ($tr);
    11.  
    12. preg_match_all('#([a-z]+)(-[^ ]+)(?:\s|$)#sUi', $cu, $matches);
    13.  
    14. /*$new = array();
    15. $new = array_combine($matches[1], $matches[2]);
    16. print_r ($new);*/
    17.  
    18. $russ = array(
    19. "ob"=>"ОБ", "bg"=>"БГ", "gd"=>"ГД", "dn"=>"ДН", "gs"=>"ГС", "zg"=>"ЗГ", "lg"=>"ЛГ", "mm"=>"ММ", "mt"=>"МТ", "mz"=>"МЗ", "sv"=>"СВ", "po"=>"ПО",
    20. "oz"=>"ОЗ", "pr"=>"ПР", "armja"=>"АРМ", "ahm"=>"АХМ", "bazh"=>"БАЖ", "vrb"=>"ВРБ", "veres"=>"ВЕРЕС", "vish"=>"ВИШ", "gmy"=>"ГМЫ", "gorl"=>"ГОРЛ",
    21. "grig"=>"ГРИГ", "grsh"=>"ГРИШ", "ob"=>"ОБ", "ob"=>"ОБ", "dek"=>"ДЕК", "dndz"=>"ДНДЗ", "drag"=>"ДРАГ", "knz"=>"КНЗ", "kosh"=>"КОШ", "krush"=>"КРУШ",
    22. "mish"=>"МИШ", "novod"=>"НОВОД", "oln"=>"ОЛН", "privo"=>"ПРИВО", "pchi"=>"ПЧИЛ", "rev"=>"РЕВ", "ros"=>"РОС", "rudn"=>"РУДН", "rud"=>"РУД",
    23. "sun"=>"САН","sev"=>"СЕВ","sm"=>"СМ","slv"=>"СЛАВ","srk"=>"СРК","tr"=>"ТР","url"=>"УРЛ","hsh"=>"ХШ","br"=>"БР","budsh"=>"БУДЫЩ","ob"=>"ОБ",
    24. "byk"=>"БЫК", "vat"=>"ВАТ", "vys"=>"ВЫС", "vg"=>"ВЫГ", "grad"=>"ГРАД", "dan"=>"ДАН", "draz"=>"ДРАЗ", "zak"=>"ЗАК", "kash"=>"КАШ", "lavr"=>"ЛАВР",
    25. "lysk"=>"ЛИСК", "majak"=>"МАЯК", "milo"=>"МИЛО", "nik"=>"НИК", "bl"=>"БЛ", "rad"=>"РАД", "sab"=>"САБ", "cvt"=>"ЦВЕТ");
    26.  
    27. $cur = array();
    28. foreach ($matches[1] as $k=>$v){
    29.   $v = trim($v);
    30.     foreach ($russ as $kk=>$vv){
    31.   $kk = trim($kk); $vv = trim($vv);
    32.         if ($v == $kk) {$cur[$k] = $vv;}
    33. }
    34. }
    35.  
    36. $cur = array_values($cur);
    37.  
    38. print_r($cur);
    39. // print_r($matches[2]);
    40.  
    41. $a = count($cur);$b = count($matches[2]);
    42. echo $a."-".$b;
    43.  
    44. $cur2 = array_combine($cur, $matches[2]);
    45.  
    46. //  echo '<pre>'.print_r($matches[1], true).'</pre>';
    47. //  echo '<pre>'.print_r($matches[2], true).'</pre>';
    48. ?>
    Сам файл bububu.txt
    Код (Text):
    1.  
    2. ob-28b-1-P-new-s2
    3.  bl-82-1-p-s
    4.  gd-47-1-P-new-s
    5.  mm-11b-5-P-new-s
    6.  hsh-21`6-4-P-s
    7. ........и так 2035 записей
     
  2. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ты блин определись.
     
  3. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Apple
    ))))), да только смотри за последовательностью:
    Сначала просто - print_r($cur); выводит ( ....[2033] => РАД [2034] => СЕВ ); //вывожу весть массив
    а потом $cur = array_values($cur); print_r($cur); и вот теперь (....[1968] => РАД [1969] => СЕВ ));!!!!!!//вывожу все значения из массива

    И вот только что делаю поиск всех ключей со значением "МТ" $c = array_keys($cur, 'МТ');print_r($c); выводит ...[87] => 2020 [88] => 2031 ) тоесть ключи и значения после 1970-го он видит.
    Херня какая-то?!?!??!

    Может кто-то сталкивался, нид хелп.
     
  4. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Panter7777
    скорее всего в массиве некоторые значения стоят в NULL, потому их и не считает.
     
  5. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Блин вот уже сравнения:
    $cur - весть массив;
    $cur2 - все значения массива $cur;
    Код (Text):
    1.  
    2. $cur2 = array_values($cur);
    3. var_dump(array_diff($cur, $cur2));
    выводит: // array(0) { }

    так же ищю по пустым занчениям:
    $c = array_keys($cur, ' ');print_r($c); // выводит Array ( ) !!!!!!//нет пустых значений

    Тоесть нет расхождений, ёпта что за нах....все шло как по маслу, а тут хня какая-то.
     
  6. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Gromo
    Как это проверить???
     
  7. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Я смотрю "пых" с массивами ну не хочет дружить ну никак!
    Вот пример: функции array_combine();
    Два массива у каждого по 2035 значений:

    Код (Text):
    1.  
    2. Array1
    3. (........
    4. [2033] => rad
    5. [2034] => sev
    6. )
    7.  
    8. Array2
    9. (........
    10. [2033] => -42`10-5-P-s
    11. [2034] => -19-2-P-s2
    12. )
    Делаю объединение массивов в один!
    Код (Text):
    1.  
    2. $cur2 = array_combine($matches[1], $matches[2]);
    3. $s = count($cur2);
    4. echo $s;// показывает 62 записи
     
  8. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Ну наконец-то хоть что-то становится проясняться, выдает коегде ошибку Notice: Undefined offset:
    после:

    Код (Text):
    1. for ($i=0;$i<count($matches[2]);$i++){print_r ($cur[$i].$matches[2][$i]);}
    вот некоторые значения вылетают:

    Код (Text):
    1. ГС-41-1-P-new-sДРАГ-42-7-P-sАХМ-16v-2-P-s
    2. Notice: Undefined offset: 1664 in /data/www/ctd/andy/test4.php on line 48
    3. -8-4-P-sГРИГ-31-1-P-sХШ-152-6-P-sХШ-154-2-P-sММ-23`27-5-P-new-sТР-6j-11-P-sТР-6j-5-P-s
    4. Notice: Undefined offset: 1671 in /data/www/ctd/andy/test4.php on line 48
    5. -44-1-P-s
    Осталось рабобраться почему и исправить!!!
     
  9. VItalijs

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

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    if ($v == $kk) {$cur[$k] = $vv;}

    раз здесь if, то вероятно иногда условие не выполняется, и в массиве каких-то ключей не хватает

    echo count(array(21312=>"bullshit")); // 1, а не 21312
     
  10. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    VItalijs
    Ты абсолютно прав, как раз разобрался думал отпостить, как тут уже вижу - ты написал. Еще был прав Gromo!!!
    if ($v == $kk) {$cur[$k] = $vv;} // как раз кое где не хватало некоторых ключей, после ошибки Notice: Undefined offset: Начал проверять с конца в начало и нашол ..что Notice: Undefined offset: 1664 in - в первоначальном виде была
    [1664] =>"san", а в массиве $russ = array( этого ключа не было, вот условие и не выполнялось!!!! ФУХ.

    Осталось дело за малым. Не могу из двух равных по ключам массивов создать один!!!


    Код (Text):
    1. $a = count($cur);$b = count($matches[2]);
    2. echo "a:".$a." b:".$b; // выводит количество ключей - а: 2035 b: 2035

    Код (Text):
    1.  
    2. $cur2 = array_combine($cur, $matches[2]); //объединял эти два массива, один как ключи второй как значения
    3. $z = count($cur2);echo $z; // весь массив занял ровно 62 записи???!?!?!
    А как же 2035???? ох я и замахался.
     
  11. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    если в первом массиве есть неуникальные элементы - результирующий массив создастся лишь из уникальных

    В мануале это не написано, зато написано в комментах к мануалу

     
  12. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    tommyangelo
    Спасибо за инфу, а то бы долго искад еще причину, Ладно пойдем по другому пути.
     
  13. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Гляньте синтаксис правельный?
    Код (Text):
    1. for ($i=0;$i<count($matches[2]);$i++)
    2.  
    3. {
    4. $address = $cur[$i].$matches[2][$i];
    5.   //echo $address."<br>";
    6. $sql_check = mysql_query("select name from jek_address") or die (mysql_error());
    7. $res = mysql_fetch_assoc($sql_check);if (!$res){echo mysql_error();}
    8.   if ($res['name'] != $address){
    9. $sql =mysql_query("insert into jek_address SET (name) values (".$cur[$i].$matches[2][$i].")");
    10.                 }
    11.  
    12.  
    13. }
    14.  
    15. if (!$sql){echo mysql_error();}
    Вообщем ошибку бьет - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values (СЕВ-19-2-P-s2)' at line 1

    А если сам запрос вставить в phpmyadmin, то :

    Код (Text):
    1. Ошибка
    2.  
    3. SQL-запрос:
    4.  
    5. INSERT INTO jek_address SET( name )
    6. VALUES (
    7. СЕВ -19 -2 - P - s2
    8. )
    9.  
    10. Ответ MySQL: Документация
    11. #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(name) values (СЕВ-19-2-P-s2)' at line 1
    values (СЕВ-19-2-P-s2)' at line 1 - Что за символы????
     
  14. Panter7777

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

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Наконец-то сделал, всем большое спасибо за помощь. Может кому-то пригодится:
    Код (Text):
    1.  
    2. for ($i=0;$i<count($matches[2]);$i++)
    3.  
    4. {
    5. $address = $cur[$i].$matches[2][$i];
    6.   //echo $address."<br>";
    7. $sql_check = mysql_query("select name from jek_address") or die (mysql_error());
    8. $res = mysql_fetch_assoc($sql_check);if (!$res){echo mysql_error();}
    9.   if ($res['name'] != $address){
    10. $sql =mysql_query("insert into jek_address (name) values ('$address')");
    11.                 }
    12. }
    13.  
    14. if (!$sql){echo mysql_error();}