Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP - можно ли вставить в массив строку с сохранением ключей? / 16 сообщений из 16, страница 1 из 1
11.08.2015, 18:59
    #39027410
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
У меня есть ассоциированный массив и мне нужно вставить элемент в середину.
Если использовать array_splice($array, $pos, 0, $value), то значение вставляется, но в массиве слетают ключи. И кроме того, нет возможности указать ключ для вставляемого значения.
Сейчас я использую такую функцию (пока не заменил на два array_slice с preserve_keys):
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
$new = array();
$i = 0;
foreach ($array as $k=>$v)
{
	$i++;
	if ($index == $i) $new[$id] = $item;
	$new[$k] = $v;
}
$array = $new;


А можно ли обойтись встроенной функцией?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
11.08.2015, 19:33
    #39027430
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
Alibek B.У меня есть ассоциированный массив и мне нужно вставить элемент в середину.Однако, у ассоциативного массива в явном виде нет ни начала, ни конца, ни середины. Все элементы определены именами ключей и слетать при вставке там нечему. Или Ваш массив не ассоциативный, а простой, с порядковыми индексами.

Alibek B.нет возможности указать ключ для вставляемого значения.Гхм... Простите, но каким-то образом Вы знаете, куда именно нужно вставить элемент.
...
Рейтинг: 0 / 0
11.08.2015, 21:04
    #39027459
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
В PHP массивы могут быть одновременно и позиционными, и ассоциативными.
Это развращает, но такая особенность оказалась удобной для одной моей задачи.
Вот эта функция полностью решает мою задачу:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
        public function insert($id, $name, $data=null, $index=null)
        {
                if (!isset($id)) return;
                $item = array('id'=>$id, 'name'=>$name, 'data'=>$data);
                if (isset($index))
                {
                        $new = array();
                        $i = 0;
                        if ($index == $i) $new[$id] = $item;
                        foreach ($this->item as $k=>$v)
                        {
                                $i++;
                                if ($index == $i) $new[$id] = $item;
                                $new[$k] = $v;
                        }
                        if ($index > $i) $new[$id] = $item;
                        $this->item = $new;
                }
                else
                {
                        $this->item[$id] = $item;
                        $index = count($this->item);
                }
                return $index;
        }


Но вдруг можно сделать то же самое встроенными функциями (array_splice или array_merge/array_slice)?
...
Рейтинг: 0 / 0
11.08.2015, 22:43
    #39027484
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
Alibek B.В PHP массивы могут быть одновременно и позиционными, и ассоциативными.Ага, есть такое. Удвоенный набор элементов под разными индексами - половина под числовыми (позиционными), копия под строковыми (ассоциативными) ключами. С ассоциативными ключами проблем нет, а значения позиционных ключей переназначить придётся от конца+1 до позиции "вставки" элемента.
...
Рейтинг: 0 / 0
11.08.2015, 22:50
    #39027489
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
Однако, зачем понадобилось держать для работы два комплекта значений - не понятно. ИМХО проще использовать вспомогательный массив соответствия имён ключей и числовых индексов.
...
Рейтинг: 0 / 0
12.08.2015, 04:50
    #39027526
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
автору ассоциативного массива в явном виде нет ни начала, ни конца, ни середины
таки есть .
...
Рейтинг: 0 / 0
12.08.2015, 09:15
    #39027572
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
ScareCrowавтору ассоциативного массива в явном виде нет ни начала, ни конца, ни середины
таки есть .Ну если только в этом смысле )))
...
Рейтинг: 0 / 0
12.08.2015, 10:15
    #39027595
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
vkleАга, есть такое. Удвоенный набор элементов под разными индексами - половина под числовыми (позиционными), копия под строковыми (ассоциативными) ключами.
Нет, набор не удвоенный (во всяком случае в var_dump дублирования нет), но тем не менее у вставляемых ключей сохраняется порядок. Это, видимо, фича PHP, но весьма удобная, когда нужно работать с JSON и некоторыми другими структурами, где важен порядок элементов.
...
Рейтинг: 0 / 0
12.08.2015, 10:34
    #39027604
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
Alibek B.,
Код: php
1.
2.
3.
4.
5.
6.
7.
$i = 0;
if ($index == $i) $new[$id] = $item;
foreach ($this->item as $k=>$v) {
 $i++;
 if ($index == $i) $new[$id] = $item;
 $new[$k] = $v;
}


это можно заменить на:
Код: php
1.
2.
3.
4.
5.
6.
$i = 0;
foreach ($this->item as $k=>$v) {
 if ($index == $i) $new[$id] = $item;
 $new[$k] = $v;
 ++$i;
}


а вообще. задача как всегда - странная.
если важен порядок элементов, то нужно просто использовать цифровые индексы.
говно-архитектура рождает говнокод
...
Рейтинг: 0 / 0
12.08.2015, 10:51
    #39027619
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
да и зачем перебирать вручную когда можно
Код: php
1.
2.
3.
4.
5.
$a = [1,2,3,'four'=>'123123', 'key7'=>3123];
$b = ['five'=>'3'];
$index = 2;
$c = array_merge( array_slice($a,0,$index), $b, array_slice($a,$index) );
print_r($c); // Array ( [0] => 1 [1] => 2 [five] => 3 [2] => 3 [four] => 123123 [key7] => 3123 ) 
...
Рейтинг: 0 / 0
12.08.2015, 11:29
    #39027664
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
r uэто можно заменить на:
Нет, у меня индексы нумеруются с единицы.

r uесли важен порядок элементов, то нужно просто использовать цифровые индексы.
Мне нужен порядок элементов и быстрый доступ по ключу.
В Perl я бы использовал хеш и индексный массив.
Но если PHP позволяет это совместить, почему бы не использовать?
...
Рейтинг: 0 / 0
12.08.2015, 11:38
    #39027670
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
Alibek B.Нет, у меня индексы нумеруются с единицы.
каков тогда смысл этих строк?
Код: php
1.
2.
$i = 0;
if ($index == $i) $new[$id] = $item;


получается что это условие никогда не выполнится. вот я и советую тогда его убрать.
...
Рейтинг: 0 / 0
12.08.2015, 11:44
    #39027681
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
Новый элемент вставляется в указанную позицию (с учетом того, что нумерация начинается с единицы).
Если указана вставка в позицию 0, то элемент вставляется в начало списка.
Практически то же самое, как если бы был указан индекс 1, но в случае пустого массива содержимое цикла выполняться не будет.
...
Рейтинг: 0 / 0
12.08.2015, 11:51
    #39027692
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
Alibek B.,

а если сразу известно что мы попали на индекс. и вставили элемент в самое начало, то нет смысла перебирать весь массив и внутри делать проверку которая уже точно никогда не сработает....
кароче ясно. устраивает - пользуйся.
...
Рейтинг: 0 / 0
12.08.2015, 12:06
    #39027716
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
r uа если сразу известно что мы попали на индекс. и вставили элемент в самое начало, то нет смысла перебирать весь массив и внутри делать проверку которая уже точно никогда не сработает....
Да, проверку делать не нужно.
Но без цикла все равно не обойтись, чтобы скопировать остальные значения.
Правда можно цикл заменить на array_merge/array_slice; вчера я это пробовал, но почему-то слетали ключи, несмотря на то, что я указывал preserve_keys=true.
...
Рейтинг: 0 / 0
12.08.2015, 23:56
    #39028223
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP - можно ли вставить в массив строку с сохранением ключей?
Alibek B.vkleАга, есть такое. Удвоенный набор элементов под разными индексами - половина под числовыми (позиционными), копия под строковыми (ассоциативными) ключами.
Нет, набор не удвоенный (во всяком случае в var_dump дублирования нет), но тем не менее у вставляемых ключей сохраняется порядок.Если порядок сохраняется, а набор не удвоенный - то это обычный ассоциативный массив. Не?

Потому, вот тут что-то не схождится:
Alibek B.В PHP массивы могут быть одновременно и позиционными, и ассоциативными.
Alibek B.Нет, набор не удвоенный (во всяком случае в var_dump дублирования нет)
Тогда вопрос, как создать массив, который обладает одновременно свойствами двух разных видов, но при этом без дубликатов?

Например, делаем обычный ассоциативный массив и пытаемся обратиться к его элементу по индексу:
Код: php
1.
2.
3.
4.
<?php
$a = array('a'=>'aaa', 'b'=>'bbb', 'c'=>'ccc');
var_dump($a);
var_dump($a[1]);


Что получим? А получим вот что:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
array(3) {
  ["a"]=>
  string(3) "aaa"
  ["b"]=>
  string(3) "bbb"
  ["c"]=>
  string(3) "ccc"
}
PHP Notice:  Undefined offset: 1 in /home/vk/test.php on line 4
NULL

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


Alibek B.Мне нужен порядок элементовВот тут следует заметить, что элементы массива фиксируются в памяти последовательно по мере их создания. Соответственно, и при последовательном обращении к элементам массива порядок выдачи сохраняется ввиду последовательного чтения таблицы переменных. В таком контексте, вставка элемента в середину возможно только при пересоздании массива с требуемым порядком следования элементов.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP - можно ли вставить в массив строку с сохранением ключей? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]