2012-05-21 2 views
1

у меня есть матрица 3х3 в PHP:PHP Matrix Peek вправо, вниз, влево, вверх в массивах

2 4 6 
5 4 7 
8 5 7 

Предполагая, что я нахожусь на [0,0] элемент так 2. Что такое лучший способ для хранения, где я am в многомерном массиве в переменной $ current? Я думаю, указатель, но не уверен, как это сделать в PHP.

$current = $data[0][0]; 

Не помогает, так как он не сохраняет контекст.

Во-вторых, какой лучший способ затем посмотреть код (peeking) вправо, вниз, влево и вверх, если предположить, что текущий ток сохраняется?

Спасибо.

ответ

2

В PHP нет указателей, и вы не сможете делать указательную арифметику по ссылкам.

Вы можете использовать функции next() и prev() для перемещения вперед и назад в массиве, и вы можете использовать key(), чтобы узнать, где вы находитесь. current() вернет значение, сохраненное в текущей позиции в массиве (вроде как разыменование указателя).

Все они работают на одном уровне глубины, поэтому вы не можете найти позицию в многомерном массиве.

Наилучший способ работы с многомерными массивами, скорее всего, просто будет хранить и увеличивать/уменьшать значения X и Y, которые идентифицируют позицию в массиве. Поскольку массивы на PHP реализованы внутри как хеши, ссылка $data[$x][$y] очень быстрая, независимо от того, что $x и $y содержат.

Например, если текущая позиция в матрице (1, 1), вы можете иметь переменную запоминанию это:

$current = ['x' => 1, 'y' => 1]; 

Чтобы узнать, что хранится там, посмотреть его:

$x = $current['x']; 
$y = $current['y']; 
$data[$x][$y]; 

Чтобы узнать, что хранится в верхнем левом углу этой позиции, можно получить позицию, просто вычитание 1 из координат текущей позиции, а затем смотрит эту позицию:

$x = $current['x'] - 1; 
$y = $current['y'] - 1; 
$data[$x][$y]; 
1

Просто используйте единственное значение в качестве индекса, и value % 3 = row, (int)(value/3) = column для вас. Чтобы подняться на 3, спуститься на 3, уменьшить на 1, увеличить справа на 1. Также убедитесь, что вы всегда находитесь на границах.

+1

Это путь. модульные арифметические работы здесь потрясающие. – goat

+0

Это действительно более элегантное решение. Он работает для квадратных или прямоугольных матриц, но не для тех, где строки или столбцы могут иметь различное количество элементов. Я не знаю контекста проблемы OP, но это, вероятно, не проблема. – octern

0

Не могли бы вы просто сохранить свое текущее положение в виде двухэлементного массива?

$current = array(0,0) 

И тогда вы сможете получить доступ к переменной в точке $ тока с:

$array[$current[0]][$current[1]] 

Если итерация массива - Я полагаю, используя пару вложенных циклов - вы бы просто приращение $current[0] во внешнем контуре и приращение $current[1] во внутреннем цикле (и установить его в ноль во внешнем цикле). Обратите внимание, что это сохраняет вашу «вертикальную» позицию в первом элементе $ current.Если вы хотите, чтобы порядок был (x, y), как стандартные декартовы координаты, просто измените два элемента.

Смежные вопросы