Jump to content
  • 0

ссылка на массив


Yazon_Nile
 Share

Question

Привет. Есть вопрос по php

 

К примеру такая запись на JS

var a = [1];var b = a;a.push(2);console.log(;// выведет [1, 2];

Теперь на пхп

$a = [1];$b = $a;array_push($a, 2);print_r($;// и будет условно [1] - без двойки

Есть возможность в php работать с разными ссылками на один и тот же массив?

Edited by Yazon_Nile
Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

во-первых, где у вас массив? [1] - это считается массивом?

$a = array(1, 2);array_push($a, 3);print_r($a);

во-вторых, array_push - добавляет один, или несколько элементов в конец массива, и не является ссылкой на массив.

поясните подробнее что вы имели ввиду под ссылками на массив?

Link to comment
Share on other sites

  • 0

в случае с JS после строчки "var b = a;" у меня возникает ситуация, когда у меня один массив, и две ссылки на него.

Поясню лучше :)

var a = [1, 2];bar b = a;a.push(3);b.push(4);console.log(a); // [1, 2, 3, 4]console.log(; // [1, 2, 3, 4]

Исходный массив изменится. Т.е пременные a и b ссылаются на один и тот же массив.

 

В PHP же после строчки "$b = $a;" переменная $b начинает ссылаться на совершенно другой массив.

$a = [1, 2];$b = $a;array_push($a, 3);array_push($b, 4);print_r($a); // [0 => 1, 1 => 2, 2 => 3];print_r($; // [0 => 1, 1 => 2, 2 => 4];
Edited by Yazon_Nile
Link to comment
Share on other sites

  • 0

В PHP это называется жесткой ссылкой и записывается как "= &$var".

$a = array(1,2);$b = &$a;array_push($a, 3);array_push($b, 4);print_r($a); // [0 => 1, 1 => 2, 2 => 3, 3 => 4];print_r($; // [0 => 1, 1 => 2, 2 => 3, 3 => 4];

P.S. Кстати, так можно передавать объекты в аргументы функций чтобы функции могли их изменять (но лучше так не делать, ибо потом понять почему объект изменяется может быть затруднительно, да и скрытые изменения это не по феншую):

 

Вариант 1: функция принимает объет

function myfunc (&$arg) {  $arg = "initial object has been modified inside function";}$str = "some string";myfunc($str);print_r($str);

Вариант 2: объект передается функции

function myfunc ($arg) {  $arg = "this function does not modify its arguments, but user can pass an object by reference and then they will be changed";}$str = "some string";// Обычная передача аргументаmyfunc($str);print_r($str);// Передача по ссылкеmyfunc(&$str);print_r($str);
Edited by ows.nightwolf
  • Like 1
Link to comment
Share on other sites

  • 0

 

в случае с JS после строчки "var b = a;" у меня возникает ситуация, когда у меня один массив, и две ссылки на него.

Поясню лучше :)

var a = [1, 2];bar b = a;a.push(3);b.push(4);console.log(a); // [1, 2, 3, 4]console.log(B); // [1, 2, 3, 4]

Исходный массив изменится. Т.е пременные a и b ссылаются на один и тот же массив.

 

В PHP же после строчки "$b = $a;" переменная $b начинает ссылаться на совершенно другой массив.

$a = [1, 2];$b = $a;array_push($a, 3);array_push($b, 4);print_r($a); // [0 => 1, 1 => 2, 2 => 3];print_r($B); // [0 => 1, 1 => 2, 2 => 4];

1) в php массивы так не обозначаются: [1, 2];

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

<?php$a = array(1, 2);array_push($a, 3);$b = $a;array_push($b, 4);echo '<pre>'; print_r($a); echo '</pre>'; // [0 => 1, 1 => 2, 2 => 3];echo '<pre>'; print_r($B); echo '</pre>'; // [0 => 1, 1 => 2, 2 => 3, 3 => 4];?>
Link to comment
Share on other sites

  • 0

2) программа идет по коду сверху вниз и никак иначе, соотв. все перезаписи она фиксирует

Это я прекрасно понимаю и вижу по результату работы)

Но вопрос состоял в том, как это обойти, чтобы было "как в JS"

 

В PHP это называется жесткой ссылкой и записывается как "= &$var".

спасибо, попробую.

Link to comment
Share on other sites

  • 0

во-первых, где у вас массив? [1] - это считается массивом?

1) в php массивы так не обозначаются: [1, 2];

И не стыдно тебе новичков в заблуждение вводить?

http://php.net/manual/ru/language.types.array.php

Ладно, я не очень слежу за новостями в языке и использую дедовский подход, но уж от гуру этого форума такого не ожидал. Даже я знаю, что давно уже можно задавать массивы как в JS.

Я в пятницу столкнулся с таким поведением js, долго искал причину. Оказалось, что надо было a = b.slice(), а иначе получается две ссылки на один массив (ссылка == указатель, если кому ближе сишная терминология). Если не ошибаюсь, если в сях присвоить переменную-массив другой переменной, получится точно такая же ситуация, потому что там массив — это только указатель на область данных, и присваивается тоже только указатель.

В php уже ответили как сделать, через &

  • Like 1
Link to comment
Share on other sites

  • 0
Оказалось, что надо было a = b.slice()
 

Именно. Но мне как раз все надо было наоборот :))
Зная отлично поведение JS в данном случае расчитывал на то же в пхп. Вышло все не так)

 

И не стыдно тебе новичков в заблуждение вводить?

да ладно. У "новичков" голова на плечах своя есть :).

Link to comment
Share on other sites

  • 0
И не стыдно тебе новичков в заблуждение вводить? http://php.net/manua...types.array.php Ладно, я не очень слежу за новостями в языке и использую дедовский подход, но уж от гуру этого форума такого не ожидал. Даже я знаю, что давно уже можно задавать массивы как в JS.

нет, не стыдно.

даже от гуру можно ожидать все что угодно, ты ведь и сам - гуру :)

скажу лишь одно - я не знал, и более того, скажу спасибо за поправку, теперь буду знать ;)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy