Убить повторяющиеся элементы в двумерном массиве

12
Progr@mmer\.
На сайте с 14.10.2007
Offline
44
7975

Есть аналогичный массив:


$array = array(
0 => array(
0 => 'text1',
1 => 'text2',
2 => 'text1',
3 => 'text1',
4 => 'text0'),
1 => array(
0 => 'text1_text123',
1 => 'text2_text456',
2 => 'text1_text789',
3 => 'text1_text987',
4 => 'text0_text651')
);

Нужно убить повторяющиеся элементы в $array[0] и убить элементы с таким же ключом в $array[1].


// 1
$array[0] = array_unique($array[0]);

// 2
$array = array_unique($array);

// ни первое, ни второе не подойдёт, т.к. из $array[1] элементы не удалятся

Написал простенький перебор элементов со сравниванием и удалением одинаковых элементов из обоих вложеных массивов:


$count1 = sizeof($array);
$count2 = sizeof($array[0]);
$count2_i = $count2 - 1;

for ($i = 0; $i < $count2_i; $i++) {
for ($j = ($i + 1); $j < $count2; $j++) {
if ($array[$i] == $array[$j]) {
unset($array[0][$i], $array[1][$i]);
}
}
}

Но столкнулся с этим:


Notice: Undefined offset: 4 in y:\home\myscripts\site\functions.php on line 232
Notice: Undefined offset: 5 in y:\home\myscripts\site\functions.php on line 232
Notice: Undefined offset: 6 in y:\home\myscripts\site\functions.php on line 232
Notice: Undefined offset: 7 in y:\home\myscripts\site\functions.php on line 232
Notice: Undefined offset: 8 in y:\home\myscripts\site\functions.php on line 232
Notice: Undefined offset: 9 in y:\home\myscripts\site\functions.php on line 232

С foreach() и while() ничего подобного придумать не могу. Может кто подскажет как мне удалить повторные элементы из двух вложенных массивов? Буду очень благодарен!

Вашей девушке не хватает романтики? Черпните её на сайте «Я Люблю Романтику» (http://iloveromantics.ru/). Романтический форум (http://forum.iloveromantics.ru/) для отдыха от нудной работы.
R2
На сайте с 01.02.2007
Offline
28
#1

А почему не использовать array_unique ?


for ($i = 0; $i < $count1; $i++) {
$array[$i] = array_unique($array[$i]);
}

(и в обсуждениях есть аналоги)

Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#2
Progr@mmer.:
PHP код:
//*1
$array[0]*=*array_unique($array[0]);*

//*2
$array*=*array_unique($array);*

//*ни*первое,*ни*второе*не*подойдёт,*т.к.*из*$array[1]*элементы*не*удалятся*
Raul21:
А почему не использовать array_unique ?
Raul21:
(в обсуждениях есть аналоги)

Сейчас посмотрю повнимательнее.

Kolyaj
На сайте с 28.03.2006
Offline
69
#3

Есть же функция array_key_exists.

Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#4
Kolyaj:
Есть же функция array_key_exists.

Ага, спасибо, помогло, но не до конца :)


for ($i = 0; $i < $count2_i; $i++) {
if (array_key_exists($i, $array[0]) !== true)
break;

for ($j = ($i + 1); $j < $count2; $j++) {
if (array_key_exists($j, $array[0]) !== true)
break;

if ($array[0][$i] == $array[0][$j]) {
unset($array[0][$i], $array[1][$i]);
}
}
}

Закидывает браузер вот этим:


Notice: Undefined offset: 1 in y:\home\myscripts\site\functions.php on line 251

А на 251 строчке кода это:


if ($array[0][$i] == $array[0][$j]) {

Progr@mmer\. добавил 26.05.2008 в 17:33

Raul21:
for*($i*=*0;*$i*<*$count1;*$i++)*{******$array[$i]*=*array_unique($array[$i]);}*

А Вы присмотритесь к моему массиву. Должны понять, почему такое применение не возможно. Не поймёте — пишите, популярно объясню.

DI
На сайте с 03.01.2007
Offline
123
#5


$result = array_unique($array[0]);
$div = array_diff_key($array[1],$result);
foreach ($div as $key => $cur) unset($array[1][$key]);
Высказывание идиотского утверждения требует на порядок меньше усилий, чем его последовательное и обоснованное опровержение и более того, иногда это опровержение вообще невозможно. © (http://zhurnal.lib.ru/s/shapiro_m_a/raspidiota.shtml)
Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#6

DenIT, большое спасибо! То что надо!


// for PHP4
$div = (function_exists('array_diff_key')) ? array_diff_key($array[1], $result) : PHP4_array_diff_key($array[1], $result);

function PHP4_array_diff_key()
{
$arrs = func_get_args();
$result = array_shift($arrs);
foreach ($arrs as $array) {
foreach ($result as $key => $v) {
if (array_key_exists($key, $array)) {
unset($result[$key]);
}
}
}
return $result;
}
R2
На сайте с 01.02.2007
Offline
28
#7

Много букв...


$array[0] = array_unique($array[0]);
foreach ($array[1] as $key => $val){
if (!array_key_exists($key, $array[0])) unset($array[1][$key]);
}
DI
На сайте с 03.01.2007
Offline
123
#8
Raul21:
Много букв...

$array[0] = array_unique($array[0]);
foreach ($array[1] as $key => $val){
if (!array_key_exists($key, $array[0])) unset($array[1][$key]);
}

Raul21, у Вас на 7 букв больше, если уж на то пошло:)

И потом, зачем вызывать в цикле функцию, которая будет бегать по массиву при каждой итерации? Если есть 1000 элементов массива - то мы пробежимся 1000 раз полностью по соседнему массиву (схожего размера).

В моем варианте вызывается всего одна функция, а цикл (который ничего не вызывает) проходит только по разнице массивов, т.е. заведомо меньшее количество раз.

Хотя, конечно, кому-то важнее "мало букв" :)

R2
На сайте с 01.02.2007
Offline
28
#9

DenIT,

Согласен полностью.

Для PHP5 Ваше решение, безусловно, лучшее

Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#10

Raul21, спасибо за ещё один вариант. :)

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

DenIT, главное чтобы качественно работало. :)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий