Сопоставьте карты с PHP


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

Я пытаюсь написать сценарий, где $t - это 2D-массив, содержащий карты:

$t = array();

// $t['1'] represents the 'center' triangle in this basic example
$t['1'] = array(
    '1', // One side of T1, which is an answer
    '3-1', // Another side, this is a question
    '2+1' // Final side, another question
);

// These cards go around the outside of the center card
$t['2'] = array(
    '2-1' // This is a question on one side of T2, the other sides are blank
);
$t['3'] = array(
    '2' // This is an answer on one side of T3, the other sides are blank
);
$t['4'] = array(
    '3' // This is an answer on one side of T4, the other sides are blank
);

Что теперь нужно сделать, это сказать, например, "T1-S1 соответствует T2, T1-S2 соответствует T3, T1-S3 соответствует T4". Я пробовал, и то, что у меня есть до сих пор, приведено ниже:

foreach ($t as $array) {
    foreach ($array as $row) {
        $i = 0;
        while ($i <= 4) {
            if(in_array($row, $t[$i])){
                echo $row . ' matches with triangle ' . $i . '<br />';
            }
            $i++;
        }
    }
}

Примечание: Приведенный выше код предназначен для упрощенной версии, в которой все вопросы были "решены", и он просто соответствовал двум сторонам.

После выполнения моего кода я получаю следующий вывод:

1 matches with triangle 1
1 matches with triangle 2
2 matches with triangle 1
2 matches with triangle 3
3 matches with triangle 1
3 matches with triangle 4
1 matches with triangle 1
1 matches with triangle 2
2 matches with triangle 1
2 matches with triangle 3
3 matches with triangle 1
3 matches with triangle 4

Проблема в том, что $row указывает мне только сторону треугольника, а не сам треугольник. Итак, мой вопрос таков:

Как мне заставить мой сценарий работать так, чтобы он выводит "Ta-Sb совпадает с Tc-Sd", где a - треугольник, b - сторона, c - треугольник, с которым он совпадает, и d - сторона, с которой он совпадает, предполагая, что в каждом массиве значения для сторон в порядке?

Я надеюсь, что вопрос ясен, однако не стесняйтесь задавать любые вопросы.

Кроме того, в идеале, как только он совпадет с Ta-Sb with Tc-Sd, он не должен совпадать с Tc-Sd with Ta-Sb. Возможно ли и это тоже?

Author: Benedict Lewis, 2013-09-13

2 answers

Я нахожу, что к таким типам проблем проще подходить с объектами, а не с массивами. Слишком сложно запомнить, что означает каждый уровень массива и как они выстраиваются. Так что я мог бы сделать что-то вроде этого:

<?
// I say Polygon instead of triangle because ideally the logic should scale for squares, octagons, anything! But start with triangles of course.
class Polygon{ 
  var $Sides = array(); // Side objects - there should be 3 of them for a triangle
  var $matches = array(); // holds the ids of the matching polygonn - keys line up with $Sides

  function __construct(){
    $Sides[0] = new Side();
    $Sides[1] = new Side();
    $Sides[2] = new Side();
  }

}

class Side{
  var $Question; // Question object
  var $state; // 'q' or 'a' - does this side show the question or answer?

  function __construct(){
    $Question = new Question();
  }

}

class Question{
  var $id; // database id of the question
  var $question;
  var $answer;
}
?>

Для заполнения:

<?php

$Triangle[0]=new Polygon();
$Triangle[0]->Side[0]->Question->id=1;
$Triangle[0]->Side[0]->Question->question='Yo momma serves more requests than what?';
$Triangle[0]->Side[0]->Question->answer='HTTP';
$Triangle[0]->Side[0]->state='q'; // This side shows the question
$Triangle[0]->matches[0]= 4; // Side 0 of this triangle matches a side of triangle 4

// write a loop that does this for all triangles using whatever your logic is for matching them up

?>

Теперь вы можете легко узнать, с каким треугольником, стороной, вопросом или совпадением вы имеете дело, сказав, например:

$Полигон[2]->Стороны[1]->состояние (означает, что сторона этого треугольника должна показывать ответ, а не вопрос )

$Полигон[0]->Стороны[3]->Вопрос->идентификатор (будет содержать идентификатор вопроса)

$Полигон[1]->соответствует[2] (будет содержать ключ треугольника, который соответствует стороне 2 полигона 1)

Это может показаться скачком, если вы не привыкли к объектам, но это довольно простой способ, вы можете просто относиться к ним как к прославленным массивам и забыть обо всех других вещах, которые могут делать объекты на данный момент.

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

Надеюсь, это поможет!

 1
Author: Syntax Error, 2013-09-13 18:35:51

Помогает ли это?

foreach ($t as $ti => $array) {
    foreach ($array as $ri => $row) {
        $i = 0;
        while ($i <= 4) {
            if(in_array($row, $t[$i])){
                echo $row.' '.$ti.' '.$ri.' matches with triangle ' . $i . '<br />';
            }
            $i++;
        }
    }
}
 0
Author: Andy Gee, 2013-09-13 17:26:15