powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / не работает end
6 сообщений из 6, страница 1 из 1
не работает end
    #38561738
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;
    }    



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

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

Код: php
1.
2.
private function isCostArrayHaveTerminateFlag(&$costs_array) {
        $last_item = end($$costs_array);
...
Рейтинг: 0 / 0
не работает end
    #38561806
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
не работает end
    #38561862
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно у меня работает как у вас в первом примере... и мой совет - ваще не в тему.

Код: 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
не работает end
    #38561945
ZardoZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тестовый массив у меня такой

Код: 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
не работает end
    #38561961
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
end возвращает по значению а не по ссылке
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / не работает end
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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