Пошаговое сравнение ячеек многомерного массива с записью результатов в таблицу

Darkstar

Новичок
Пошаговое сравнение ячеек многомерного массива с записью результатов в таблицу

Дан массив (таблица), содержащее в каждой строке набор из некоторого конечного множества символов (например, A, B, C, D и E).

Например,

A, A, B
A
A, B, C
B, C
D
A, A, D
E, D

Нужно последовательно сравнивать каждую строку массива с каждой другой строкой массива. Если совпадает ХОТЯ БЫ ОДИН символ, писать 1, если не совпадает ничего, писать 0.

Итак, нужно взять ПЕРВУЮ строку (А, А, B) и сравнить ее со 2-ой строкой (A), 3-й (A, B, C), 4-й... n-й
Потом берется 2-я строка и опять с 3-й, 4-й и т.д. – т.е. со всеми которые НИЖЕ (можно и со всеми вообще, начиная с 1-й, но тогда матрица сравнения будет не «половинчатая», а полная, симметричная – ладно мне сойдет и так, если это сложно…)
Потом 3-я с 4-й, 5-й, 6-й и т.д.
….
В конце предпоследняя строка с последней строкой.

При этом результат сравнения $a каждый раз должен записываться отдельно в ячейку НОВОЙ таблицы РЕЗУЛЬТАТОВ СРАВНЕНИЯ и как-то там ПОТОМ еще должен многократно суммироваться, потому что таких самосравнений таблиц будет много… Для чего это вообще нужно? Такая операция типа показывает статистическую степень родства или генетической близости cодержимого строк друг с другом.

Т.е. получится должно что-то вроде

1 – первая со второй
1 – первая с третьей
1 – первая с четвертой
0 – первая с пятой (ни одного общего элемента)
и т.д.

В итоге имеем что-то вроде:

1
1 1
1 0 1
0 0 0 0
1 1 1 0 1
0 0 0 0 1 1

Пока для начала прошу объяснить хотя бы как сравнивают две строки такого массива. Мне кажется, задача не cовсем тривиальная.

PS: Я не проф. программист PHP, я просто пытаюсь решить конкретную задачу.

-~{}~ 10.08.09 20:23:

Как сравнивать строки, так чтобы найти ХОТЯ БЫ один общий элемент, я уже придумал. Нужно взять ПЕРЕСЕЧЕНИЕ двух массивов, а затем подсчитать кол-во общих элеметов и посмотреть больше ли оно нуля

<?php

$a1=array(0=>"A",1=>"B",2=>"A");
$a2=array(3=>"D",4=>"C");
print_r(array_intersect($a1,$a2));

echo "<br /> The number of common elements is ".count(array_intersect($a1,$a2));

if (count(array_intersect($a1,$a2)) > 0)
{$a =1; echo "<br /> a=".$a;}
else
{$a =0; echo "<br /> a=".$a;}

?>

Но как последовательно сравнивать строки, пока не знаю.
 

Darkstar

Новичок
Не, я не понимаю.

Мне нужно зафиксировать строку и сравнивать ее со всеми строками.
 

Darkstar

Новичок
Да, кажется просекаю. Как-то так:

$arr[0][0]="A";
$arr[0][1]="A";
$arr[0][2]="B";
$arr[1][0]="A";
$arr[2][0]="A";
$arr[2][1]="B";
$arr[2][2]="C";
$arr[3][0]="B";
$arr[3][1]="C";
$arr[4][0]="D";
$arr[5][0]="A";
$arr[5][1]="A";
$arr[5][2]="D";
$arr[6][0]="E";
$arr[6][2]="D";

for($i = 0; $i < sizeof($arr); ++$i)
{
$a2=$arr[$i];
$a1= $arr[0];

echo "<br /> The number of common elements is ".count(array_intersect($a1,$a2));

if (count(array_intersect($a1,$a2)) > 0)
{$a =1; echo "<br /> a=".$a;}
else
{$a =0; echo "<br /> a=".$a;}


}
?>

Вывод:

The number of common elements is 3
a=1
The number of common elements is 2
a=1
The number of common elements is 3
a=1
The number of common elements is 1
a=1
The number of common elements is 0
a=0
The number of common elements is 2
a=1
The number of common elements is 0
a=0
 

dimagolov

Новичок
Darkstar, как-то, только циклов должно быть 2, один внутри другого (ты же всех со всеми сравнить хочешь) и верхняя граница цикла у тебя всегда кол-во массивов, то есть count($arr), до циклов сохраняешь это значение в переменную и по ней пишешь условие выхода из цикла:
PHP:
$l=count($arr);
for ($i= 0; $i < $l; $i++) {
...
}
 

Darkstar

Новичок
Ну я уже сделал, у меня немного не так:

PHP:
for($j = 0; $j < sizeof($arr); ++$j)
{
for($i = 0; $i < sizeof($arr); ++$i)
{
	if ($j<$i) 
	{	
	$a2=$arr[$i];
	$a1= $arr[0 + $j];

	echo "<br /> For $j $i the number of common elements is ".count(array_intersect($a1,$a2));

	if (count(array_intersect($a1,$a2)) > 0) 
	{$a =1; echo "<br /> a=".$a;}
	else
	{$a =0; echo "<br /> a=".$a;}
	}

}}
Вывод соответствует таблице, посчитанной вручную:

For 0 1 the number of common elements is 2
a=1
For 0 2 the number of common elements is 3
a=1
For 0 3 the number of common elements is 1
a=1
For 0 4 the number of common elements is 0
a=0
For 0 5 the number of common elements is 2
a=1
For 0 6 the number of common elements is 0
a=0
For 1 2 the number of common elements is 1
a=1
For 1 3 the number of common elements is 0
a=0
For 1 4 the number of common elements is 0
a=0
For 1 5 the number of common elements is 1
a=1
For 1 6 the number of common elements is 0
a=0
For 2 3 the number of common elements is 2
a=1
For 2 4 the number of common elements is 0
a=0
For 2 5 the number of common elements is 1
a=1
For 2 6 the number of common elements is 0
a=0
For 3 4 the number of common elements is 0
a=0
For 3 5 the number of common elements is 0
a=0
For 3 6 the number of common elements is 0
a=0
For 4 5 the number of common elements is 1
a=1
For 4 6 the number of common elements is 1
a=1
For 5 6 the number of common elements is 1
a=1

Здесь использовано то, что в "полуматрице" без диагонали j всегда меньше i.
 

dimagolov

Новичок
Darkstar
прочитай мой первый пост в этой теме, про то какие строить циклы. потому что твой if лишний, его можно спрятать в условие вложенного цикла
 

Darkstar

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

-~{}~ 11.08.09 00:34:

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

Теперь там еще будет третий цикл, который повторяется 200 раз для всего списка таблиц (трехмерный массив), суммирование единиц и нулей друг с другом и деление на 200, чтобы найти процентное отношение "близости-родства", но это уже вроде мне понятно.

-~{}~ 16.08.09 21:13:

Я не могу понять, как PHP должен отличить столбец от слоя от колонки в трехмерном массиве.

Я пытаюсь добавить третье измерение к пред. примеру.
В этом листинге PHP пишет, что $a1 это не массив.

PHP:
<?php

$arr[0][0][0]="A";
$arr[0][0][1]="A";
$arr[0][0][2]="B";
$arr[0][1][0]="A";
$arr[0][2][0]="A";
$arr[0][2][1]="B";
$arr[0][2][2]="C";
$arr[0][3][0]="B";
$arr[0][3][1]="C";
$arr[0][4][0]="D";
$arr[0][5][0]="A";
$arr[0][5][1]="A";
$arr[0][5][2]="D";
$arr[0][6][0]="E";

for($layer = 0; $layer < 1; ++$layer) 
{ 
for($row = 0; $row < 5; ++$row) 
{ 
for($i = 0; $i < 6; ++$i) 
{ 
    if ($i>$row)  
    {     echo "<li>The synonym is ".$arr[$layer][$row]."</li>";
    $a1= $arr[$layer][$row]; 
    $a2= $arr[$layer][$i]; 

    echo "For $j $i the number of common elements is ".count(array_intersect($a1,$a2)); 

    if (count(array_intersect($a1,$a2)) > 0)  
    {$a =1; echo "<br /> a=".$a; } 
    else 
    {$a =0; echo "<br /> a=".$a; }
    $sum[$layer][$row][$col]=$a; }
        

}}}

?>
-~{}~ 16.08.09 21:33:

Пока я писал, оно уже спонтанно самоисправилось -- боится оно этого форума.

Теоретически вопрос все-таки неясен -- какие есть способы объяснить "ему", с каким столбцом, слоем, колонкой массива работать?
 
Сверху