[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Перебор массива
Noal
Вот пытаюсь сделать маленький цыкл который будет из массива удалять 1 элемент и перебирать остальное что бы было по порядку без дырок. но что то не выходит, не присваивает значение следующего элемента предидущему. Может кто что увидет?
<?php session_start();
$var=count($_SESSION['by']);
$i=intval($_REQUEST['tdn']);$_SESSION['sum']-=$_SESSION['by'][$i]['pr'];
unset($_SESSION['by'][$i]);
for ($i; $i<$var; ){
$_SESSION['by'][$i]=$_SESSION['by'][++$i];
};unset($_SESSION['by'][$var]);




Спустя 25 минут, 50 секунд (7.12.2010 - 06:31) kirik написал(а):
Не могу понять код. Вот пример переназначения:
$array = array(1,2,3,4,5,6);
for($i = 0, $c = count($array); $i < $c; $i++) {
if(isset($array[$i + 1])) {
$array[$i] = $array[$i + 1];
} else {
unset($array[$i]); // удаляем последний элемент, так как его значение уже назначено
}
}

print_r($array);
/*
Array
(
[0] => 2
[1] => 3
[2] => 4
[3] => 5
[4] => 6
)
*/


Но проще сделать так:
$array = array(1,2,3,4,5,6);
unset($array[0]); // ансетим нулевой элемент
$array = array_values($array); // "собираем" новый массив, чтобы индексация была с нуля

print_r($array);
/*
Array
(
[0] => 2
[1] => 3
[2] => 4
[3] => 5
[4] => 6
)
*/

Спустя 13 минут, 22 секунды (7.12.2010 - 06:44) Noal написал(а):
<?php session_start();
$i=intval($_REQUEST['tdn']);
$_SESSION['sum']-=$_SESSION['by'][$i]['pr'];
unset($_SESSION['by'][$i]);
array_values($_SESSION['by']);

и так не фурычит, тот элемент который удаляеться, допустим $_REQUEST['tdn'] =4
становиться пустым, но вехний пятый на него не смещаеться тем не мение удаляется последний, получается что масив стал меньше сразу на 2 ячейки, 1 изкоторых есть но пустая

А удален в итоге последний элемент массива который не при чем

Спустя 4 минуты, 5 секунд (7.12.2010 - 06:48) kirik написал(а):
Noal
Посмотрите внимательнее как используется функция array_values.

Спустя 4 часа, 17 минут, 10 секунд (7.12.2010 - 11:06) Noal написал(а):
м.. то есть если значением есть маccив использование этой функции будет довольно громоздким
$array = array(1,2,3,4,5,6);
for($i = 0, $c = count($array); $i < $c; $i++) {
if(isset($array[$i + 1])) {
$array[$i] = $array[$i + 1];
} else {
unset($array[$i]); // удаляем последний элемент, так как его значение уже назначено
}
}

print_r($array);

в первом топе я в принципи сделал то же самое
<?php session_start();
$var=count($_SESSION['by']); //считаю элементы массива
$i=intval($_REQUEST['tdn']); //принудительно делаю цифру из пришедших данных
$_SESSION['sum']-=$_SESSION['by'][$i]['pr']; //на это можно не обращать внимания
unset($_SESSION['by'][$i]); //удаляю нужным мне элемент массива
for ($i; $i<$var; ){ //ввожу цикл от $i первый элемент который подлежит замене
//пока он меньше предидущего количества элементов массива

$_SESSION['by'][$i]=$_SESSION['by'][++$i]; //здесь присваивается значение элемента ++$i (увеличеного на 1)
}; // значению элемента $i
unset($_SESSION['by'][$var]); //после того как $i становиться == $var цикл прекращается,
// элемент $var удаляется.



Прирост обуславливается инкрементом внутри цикла
но все же где то тут я ошибся user posted image

Спустя 2 часа, 13 минут, 19 секунд (7.12.2010 - 13:19) inpost написал(а):
А почему не foreach для перебора массива?

Спустя 9 минут, 44 секунды (7.12.2010 - 13:29) Noal написал(а):
А какая разница просто писал ночью что в голову пришло то и состряпал
на производительность думаю не повлияет, главное чтобы работало:)
тем более нет смысла перебирать весь масив, если можно только вес последующие элементы подвинуть.

Спустя 36 минут, 5 секунд (7.12.2010 - 14:05) myconstitution написал(а):
Всем доброго времени суток.
Что-то споткнулся на месте, помогите пожалуйста разобраться в сложившийся ситуации с массивами.

В массиве $arr содержаться старые (первоначальные) значения id и имен.

 $arr Array
(
[
1] => Array
(
[
id] => id001
[name] => name001
)

[
2] => Array
(
[
id] => id002
[name] => name002
)

[
3] => Array
(
[
id] => id003
[name] => name003
)

)


В массиве $tmp содержаться новые (измененные) значения id и имен.

 $tmp Array
(
[
id] => Array
(
[
0] => id1
[1] => id2
[2] => id3

)

[
name] => Array
(
[
0] => name1
[1] => name2
[2] => name3

)

)




Каким образом заменить значения в массиве $arr на значения из массива $tmp, но для каждого ключа соответсвенно.

Должна получиться следующая картина:
Массив $arr, после замены.

 $arr Array
(
[
1] => Array
(
[
id] => id1 //значение id взято из $tmp[id][0]
[name] => name1
)

[
2] => Array
(
[
id] => id2
[name] => name2
)

[
3] => Array
(
[
id] => id3 //значение id взято из $tmp[id][2]
[name] => name3
)

)



Спустя 1 час, 41 минута, 11 секунд (7.12.2010 - 15:46) Noal написал(а):
$q=count($arr); $w=count($tmp['id']); $e=count($tmp['name']);   // переменные для условия
if ($q==$w && $w==$e) {
foreach($arr as $key => $value){
$arr["$key"]['id'] = $tmp['id']["$key"];
$arr["$key"]['name'] = $tmp['name']["$key"];
//Наверное както так
}
}
else {echo 'массивы не могут быть качественно сложены';}

тут просто запутаться можно из за того что в них разные принцы размещения элементов так сказать.

Это конечно частный случай, чем более обобщенной будет функция тем массивнее

Спустя 23 часа, 52 минуты, 52 секунды (8.12.2010 - 15:39) Noal написал(а):
Ура сделал, хоть и кое как
<?php
print_r($_SESSION['by']);

$l=intval($_REQUEST['tdn']);
echo "<br/>$l".'<br/>';
foreach ($_SESSION['by'] as $key => $value){
if($key != $l){
echo "$key".'<br/>';
$ar[]=$value;
}
else {$_SESSION['sum']-=$_SESSION['by'][$key]['pr'];};

};Unset($_SESSION['by']);$_SESSION['by']=$ar;
print_r($_SESSION['by']);

Такой интересный этот foreach, он новые элементы в массив добавляет а старые перезаписывать не хочет...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.