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

Статус
В этой теме нельзя размещать новые ответы.

silmarion

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

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

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

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

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

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

т.е. вставлялся как он есть в файле
 
Последнее редактирование модератором:
понятно, ну можно так сделать
Код:
$go[0] = array(1 => 2);
$go[1] = array(1 => 1);
$go[2] = array(2 => 7);
 
Предыдущая тема моя
по совмещению и сверке массивов,
получается массив
key-value
key-value

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

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

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

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

т.е. вставлялся как он есть в файле
Если сделаете кеи неуникальными, вернетесь к проблеме обратно.
 
Если сделаете кеи неуникальными, вернетесь к проблеме обратно.
key1 = value1
key1 = value2
key2 = value3
key3 = value4
key1 = value5

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

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

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

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

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

исходные данные:
PHP:
{
   key1 => value1,
   key1 => value2,
   key2 => value3,
   key3 => value4,
   key1 => value5
}

получаем:
PHP:
{
    key1 => [value1, value2, value5],
    key2 => [value3],
    key3 => [value4]
}
 
Не думаю что такой вариант мне подойдет,
да и как 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

или нет?
 
Последнее редактирование:
В массиве не может быть неуникальных ключей — одинаковые ключи перезаписываются последним значением.
Выход — считать файл построчно в 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 целые цифровые ключи автоматически в массиве сортируются по порядку. Потому что в языке нет строгой типизации — не нам судить хорошо это или плохо, но такова особенность.
 
Последнее редактирование:
Чтобы не использовать ручное считывание файла, можно написать класс, реализующий ArrayAccess,
а в нем уже учесть обработку неуникальности ключей.
 
В массиве не может быть неуникальных ключей — одинаковые ключи перезаписываются последним значением.
Выход — считать файл построчно в 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 целые цифровые ключи автоматически в массиве сортируются по порядку. Потому что в языке нет строгой типизации — не нам судить хорошо это или плохо, но такова особенность.
Т.е. разбить файл на 2 массива по ключам и значениям, затем если найдено совпадение в ключах, находить такое же совпадение по номеру строки в значениях?

if( preg_match('#^(.+?)=(.+?)$#', $string, $m ) ){
Конец строки забыл, сейчас попробую, может действительно побыстрее будет
 
Последнее редактирование:
Конец строки забыл, сейчас попробую, может действительно побыстрее будет
Быстрее и без геморроя хранить значения в БД.
Можно и в 1 массиве хранить — но тогда в виде подмножества массивов с ключ=значение
Это дело потом сериализовать и записывать в файл.
Функция serialize для этого служит.
Выборка — десериализовать:
PHP:
$array=unserialize(file_get_contents($file));
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху