Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / не работает end / 6 сообщений из 6, страница 1 из 1
15.02.2014, 09:54
    #38561738
ZardoZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает end
В таком виде не работает. Хотя по описанию должно.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
     
 private function isCostArrayHaveTerminateFlag(&$costs_array) {
        $last_item = end($costs_array);

//ОТЛАДКА: так тоже не будет никаких изменений в передаваемом массиве 
//    $last_item['price'] = 100500;  

        if ($last_item === FALSE)
            return false;
         
//не отрабатывает ни в какую   
        if ($last_item['price'] === -1) {
            array_pop($costs_array);
            return true;
        }
        else
            return false;
    }      



Переписал вот так работает, хотя вроде тоже самое
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    private function isCostArrayHaveTerminateFlag(&$costs_array) {
        if (count($costs_array) === 0)
            return false;
        
        $last_price = $costs_array[count($costs_array) - 1]['price'];
            
        if ($last_price === -1) {
            array_pop($costs_array);
            return true;
        }
        else
            return false;
    }    



Объясните пожалуйста почему не работает мой первоначальный вариант?
...
Рейтинг: 0 / 0
15.02.2014, 12:40
    #38561772
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает end
ZardoZ,

А вот так будет работать?

Код: php
1.
2.
private function isCostArrayHaveTerminateFlag(&$costs_array) {
        $last_item = end($$costs_array);
...
Рейтинг: 0 / 0
15.02.2014, 13:58
    #38561806
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает end
ZardoZВ таком виде не работает. Хотя по описанию должно.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
     
 private function isCostArrayHaveTerminateFlag(&$costs_array) {
        $last_item = end($costs_array);

//ОТЛАДКА: так тоже не будет никаких изменений в передаваемом массиве 
//    $last_item['price'] = 100500;  

        if ($last_item === FALSE)
            return false;
         
//не отрабатывает ни в какую   
        if ($last_item['price'] === -1) {
            array_pop($costs_array);
            return true;
        }
        else
            return false;
    }      



Переписал вот так работает, хотя вроде тоже самое
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    private function isCostArrayHaveTerminateFlag(&$costs_array) {
        if (count($costs_array) === 0)
            return false;
        
        $last_price = $costs_array[count($costs_array) - 1]['price'];
            
        if ($last_price === -1) {
            array_pop($costs_array);
            return true;
        }
        else
            return false;
    }    



Объясните пожалуйста почему не работает мой первоначальный вариант?

Почему не работает первый вариант - я затрудняюсь ответить... мало данных. Как я понимаю "не работает" означает, что условие не выполняется и последний элемент не вытягивается из массива.

Однако! Два кода совсем разные... Отличия, которые я заметил:
1. В первом варианте берётся последний созданный элемент массива, а во втором - элемент с самым большим индексом (если считать что в индексах нету "дыр")
2. Первый вариант устанавливает указатель на последний элемент, второй - не производит с указателем массива каких либо действий. Не знаю может ли это на что либо повлиять (например foreach отрабатывается без изменений), однако думаю стоит остерегаться таких изменений.

Для более чёткого анализа хотелось бы увидеть данные, на которых первый вариант работает не как надо (например вывод print_r или var_dump входного массива)
...
Рейтинг: 0 / 0
15.02.2014, 16:15
    #38561862
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает end
Странно у меня работает как у вас в первом примере... и мой совет - ваще не в тему.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
$tmp1 = array('orange','apple','fruit');
$tmp2 = array('1',2,5,array('o','a','f'));

function changeArray(&$varArray){
	$lastItem = end($varArray);
	$last = array_pop($varArray);
	var_dump($lastItem, $last);
}

echo '<pre>';
changeArray($tmp1);
echo '</pre><br/><br/><pre>';
changeArray($tmp2);
die('</pre>');



выводит всё как надо. Скорее всего проблема в чем-то другом.
...
Рейтинг: 0 / 0
15.02.2014, 20:35
    #38561945
ZardoZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает end
тестовый массив у меня такой

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    array(
         array(
             'caption' => 'Asus X908 Белый',
             'price' => 12500 
         ),
         array(
             'caption' => 'ASUS x908 White',
             'price' => 13100 
         ),
         array(
             'caption' => 'Конец парсинга',
             'price' => -1 
         )
    )


моя задача обнаружить в последнем массиве 'price' == -1, удалить этот массив и вернуть true.
Так я даже просто пытался без всяких условий последний price заменить на 10500
Код: php
1.
2.
$last_item = end($costs_array);
$last_item['price'] = 100500;  



никаких изменений в массиве вообще. вроде в описании, что end перемещает указатель на последний элемент и возвращается его. да даже если элемент возвращается не по ссылке, то if ($last_item['price'] === -1) должно же работать.
...
Рейтинг: 0 / 0
15.02.2014, 21:32
    #38561961
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает end
end возвращает по значению а не по ссылке
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / не работает end / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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