2012-04-27 5 views
37

Есть ли способ ссылки на массив из массива? Это может иметь больше смысла в формате кода:PHP: Self-referencing array

$array=array(
    "Key1"=>array(
    "Value1", 
    "Value2" 
), 
    "Key2"=>&$this['Key1'] 
); 

То, что я хочу, чтобы $array['Key2'] на выходе такой же, как $array['Key1']. I может добавить $array['Key2']=&$array['Key1']; после того, как массив создан, но хотел бы сохранить все это в одном блоке кода, если это возможно.

Я проверил документы по ссылкам, а также некоторые из предложенных здесь вопросов и поиск «ссылки на php-массив».

+6

Нет, вы не можете. При создании массива пока нет возможной контрольной точки. Поэтому вам нужно добавить ссылку позже. – mario

+1

+1 за интересный вопрос :-) –

+1

Невозможно сделать это в одном утверждении, если вы не ссылаетесь на то, что уже существует. Таким образом, вы можете создать '$ ref = array (" Value1 "," Value2 ");' и затем выполнить '$ array = array ('Key1' => & $ ref, 'Key2' => &$ref);' и 'unset ($ ref), 'afterwards, но нет смысла, вы просто делаете то, что предложили, и создадите ссылку позже. – DaveRandom

ответ

27

Ответ на этот вопрос: как оказалось, есть Да. Однако он не является аккуратным синтаксисом, так как он использует своего рода подзапрос и оставляет текущую область, заполненную дополнительной ссылочной переменной.

Рассмотрим следующий код:

<?php 

    $array = array(

    // Creates Key1 and assigns the value to it 
    // A copy of the value is also placed in $ref 
    // At this stage, it's not a reference 
    "Key1"=>($ref = array(
     "Value1", 
     "Value2" 
    )), 

    // Now Key2 is a reference to $ref, but not to Key1 
    "Key2"=>&$ref, 

    // Now everything is referenced together 
    "Key1"=>&$ref 

); 

Я был удивлен, что это работало без ошибок, но это - here's the proof. Конечно, вы не хотели бы сделать это, но вы можете ...

+1

+1 Это работает, потому что, когда вы объявляете один и тот же ключ дважды в массиве, он перезаписывает 1-й. :-) –

+1

Действительно, это, по-видимому, случай, я действительно задавался вопросом, не пожалеет ли он, поскольку это кажется довольно странным делом, и я никогда раньше не пытался его пробовать. Очевидно, что один из них обычно переназначает ключи в массиве индивидуально, но редко в заявлении декларации! – DaveRandom

+0

@Starx: удалите комментарии и пробелы. Это только одно утверждение. –

0

Невозможно сделать это в одном блоке, потому что вы еще не инициализировали переменную. То же самое с переменными класса. Чтобы сделать такую ​​вещь, вам нужно будет создать любую переменную любым способом, а не использовать только ее ссылки, но использовать ее память, так что реальный ответ на ваш вопрос - невозможно :)