Массив с неуникальными кеями

Тема в разделе "PHP", создана пользователем silmarion, 22 сен 2014.

Статус темы:
Закрыта.
Модераторы: latteo
  1. silmarion

    silmarion

    Регистр.:
    21 июн 2012
    Сообщения:
    195
    Симпатии:
    19
    Доброго всем дня, подскажите, можно ли вывести ассоциативный массив с неуникальными кеями?

    Предыдущая тема моя
    по совмещению и сверке массивов,
    получается массив
    key-value
    key-value

    инклудом вставляю массив в скрипт к примеру миллион строк

    делаю count, выводит что вставилось 600к
    и тд

    строки в ключе которые находятся получается что повторяются

    можно ли как нибудь 1 массив сделать чтобы не было уникальности ключей?

    т.е. вставлялся как он есть в файле
     
    Последнее редактирование модератором: 25 сен 2014
    Шумадан нравится это.
  2. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.722
    Симпатии:
    2.097
    понятно, ну можно так сделать
    Код:
    $go[0] = array(1 => 2);
    $go[1] = array(1 => 1);
    $go[2] = array(2 => 7);
     
  3. CAPAXA

    CAPAXA

    Регистр.:
    7 июн 2007
    Сообщения:
    896
    Симпатии:
    535
    Если сделаете кеи неуникальными, вернетесь к проблеме обратно.
     
  4. silmarion

    silmarion

    Регистр.:
    21 июн 2012
    Сообщения:
    195
    Симпатии:
    19
    key1 = value1
    key1 = value2
    key2 = value3
    key3 = value4
    key1 = value5

    должно получится 5 значений
    а в итоге
    выводит только 3
    key1 = value1
    key2 = value3
    key3 = value4

    теряю 2 значения
    это в массиве который ищу

    а по массиву в котором ищу как раз отлично так и оставить как есть уникальнось по кеям

    так есть какая то фича для этого?

    там же получается что сравнивать мне нужно по кеям, они могут повторятся
    а вот значения они идут уникальные
     
  5. Girt

    Girt Постоялец

    Регистр.:
    11 фев 2012
    Сообщения:
    87
    Симпатии:
    62
    Можно сделать например так:
    в массиве по кею находиться массив значений.

    исходные данные:
    PHP:
    {
       
    key1 => value1,
       
    key1 => value2,
       
    key2 => value3,
       
    key3 => value4,
       
    key1 => value5
    }
    получаем:
    PHP:
    {
        
    key1 => [value1value2value5],
        
    key2 => [value3],
        
    key3 => [value4]
    }
     
    unpunk нравится это.
  6. silmarion

    silmarion

    Регистр.:
    21 июн 2012
    Сообщения:
    195
    Симпатии:
    19
    Не думаю что такой вариант мне подойдет,
    да и как CAPAXA писал геморно.
    и так в общем идея другая,
    если значение найдено,
    пишу его в файл,
    затем помещаю значение во временный массив,
    делаю унсет из текущего массива это значение (чтобы повторно в цикле не искал)

    $mytext1=$xxx[$k].":".$res[$k]."\n";
    $test=fwrite($ff, $mytext1);
    $tmp[$k] = $xxx[$k];
    unset($xxx[$k]);


    как мне в конце работы цикла сравнить значения из цикла $tmp с файлом, по которому я ищу, и если строка совпадает, физически удалить эту строку из файла-массива?

    Чтото мне кажется слишком тут перестарался, но вроде пашет, оптимизировать ее можно?

    Код:
    ранее как чтото находилось писали в массив
    ......
    $tmp=array();
    .......
    
    $tmp[$k] = $xxx[$k];
    .....
    в конце после цикла
    $tmpdel=file('find\test.php'); //открываем что искали в виде файла
    echo "<br>--------------<br>";
    
    //ищем номера строк в файле, которые были найдены, и удаляем.
    foreach($tmp as $dk => $dv){
    $input = preg_quote($dv, '~');
    $result = preg_grep('~' . $input . '~', $tmpdel);
    foreach($result as $xdk => $xdv){
    $xdk=$xdk+1;
    if ($xdk != "") {
    $xdk--;
    for($idel=0;$idel<sizeof($tmpdel);$idel++)
    if($idel==$xdk) unset($tmpdel[$idel]);
    $fpdel=fopen("find/test.php","w");
    fputs($fpdel,implode("",$tmpdel));
    fclose($fpdel);
    }
    }
    }
    
    //записываем в конце ненайденное в отдельный файл
    $nf = fopen("found_not.txt", "a");
    foreach ($xxx as $ke => $va) {
    $mytext2=$va.":".$ke."\n";
    $test=fwrite($nf, $mytext2);
    $sqlCount++;
    }
    fclose($nf);
    
    
    Не пинайте если что:eek:
    Не могу только понять не будет ли сбиваться количество строк пока foreach не закончит работы?
    Чтобы не стирал после первого правильно стертого то, что не нужно

    те к примеру он нашел 5,31,45
    стирает сначала 5
    все, что выше сдвинулись
    т.е. 31 уже 30
    45 уже 44

    или нет?
     
    Последнее редактирование: 23 сен 2014
  7. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    В массиве не может быть неуникальных ключей — одинаковые ключи перезаписываются последним значением.
    Выход — считать файл построчно в 2 массива — один ключей, другой массив значений.
    Потом так же точно и манипулировать с ними.
    В таком случае ключами будут порядковые номера значения в массиве, т.е. 0, 1, 2, 3 и т.д.
    PHP:
    $string_array=file('file');//считываем файл и сразу разбиваем в массив
    foreach ($string_array as $string) {
      if( 
    preg_match('#^(.+?)=(.+?)#'$string$m ) ){
      
    $array_keys[]=$m[1]; //ключи по порядку
      
    $array_values[]=$m[2]; //значения по порядку
      
    }
    Не знаю, как у тебя в файле или где это всё хранится — подправляй код и/или регулярку если что не так;)
    И чтобы не было непонятки, что так как делал нельзя: в PHP целые цифровые ключи автоматически в массиве сортируются по порядку. Потому что в языке нет строгой типизации — не нам судить хорошо это или плохо, но такова особенность.
     
    Последнее редактирование: 23 сен 2014
  8. Girt

    Girt Постоялец

    Регистр.:
    11 фев 2012
    Сообщения:
    87
    Симпатии:
    62
    Чтобы не использовать ручное считывание файла, можно написать класс, реализующий ArrayAccess,
    а в нем уже учесть обработку неуникальности ключей.
     
    silmarion нравится это.
  9. silmarion

    silmarion

    Регистр.:
    21 июн 2012
    Сообщения:
    195
    Симпатии:
    19
    Т.е. разбить файл на 2 массива по ключам и значениям, затем если найдено совпадение в ключах, находить такое же совпадение по номеру строки в значениях?

    if( preg_match('#^(.+?)=(.+?)$#', $string, $m ) ){
    Конец строки забыл, сейчас попробую, может действительно побыстрее будет
     
    Последнее редактирование: 26 сен 2014
  10. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    Быстрее и без геморроя хранить значения в БД.
    Можно и в 1 массиве хранить — но тогда в виде подмножества массивов с ключ=значение
    Это дело потом сериализовать и записывать в файл.
    Функция serialize для этого служит.
    Выборка — десериализовать:
    PHP:
    $array=unserialize(file_get_contents($file));
     
    silmarion нравится это.
Статус темы:
Закрыта.