X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Помогите с функцией
Book
Book
Topic Starter сообщение 5.10.2016, 13:15; Ответить: Book
Сообщение #1


Есть массив данных, который содержит названия городов

$baza = ['Астрахань','Брест','Владимир','Геленджик','Дмитров', 'Елань','Жуковский','Золотово','Ильино','Керчь', 'Ленск',
'Магадан', 'Находка', 'Обвинск', 'Пермь', 'Реутов','Сколково','Тверь', 'Уфа', 'Фролы', 'Хабаровск', 'Царево', 'Челябинск', 'Шахты',
'Щекино', 'Элиста', 'Юрга'];

Пишу функцию для которая при получении буквы от пользователя, вернет название города

function game ($a){
foreach ($baza as $value) {
if($a == mb_substr($baza,0,1,'utf-8')){
return $baza[0];
}
}
}

Делаю тест для функции 

assert('Астрахань' == game('А'));

Получаю  2 ошибки:
Warning: Invalid argument supplied for foreach() in C:\OpenServer\domains\profit.localhost\baza\data.php on line 6 - Почему инвалидный аргумент? Ведь в foreach массив $baza

 

Warning: assert(): Assertion failed in C:\OpenServer\domains\profit.localhost\baza\data.php on line 16 - это понятно что тест провален

0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ShowPrint
ShowPrint
сообщение 5.10.2016, 13:27; Ответить: ShowPrint
Сообщение #2


Artemch, если я правильно понимаю, первое что бросается в глаза, то что в

mb_substr($baza,0,1,'utf-8')

должно стоять $value, а не $baza

UPD:
Если не заработает, то в чем еще, возможно, может быть засада - область видимости переменных. Перед обращением к foreach сделайте проверку видимости массива.


Сообщение отредактировал ShowPrint - 5.10.2016, 13:31
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Book
Book
Topic Starter сообщение 5.10.2016, 14:04; Ответить: Book
Сообщение #3


ShowPrint,Да точно $value, много раз переделывал и запутался. Поменял на  $value, те же ошибки, а с областью видимости не понятно, ведь весь код выглядит так

<?php
$baza = ['Астрахань','Брест','Владимир','Геленджик','Дмитров', 'Елань','Жуковский','Золотово','Ильино','Керчь', 'Ленск',
'Магадан', 'Находка', 'Обвинск', 'Пермь', 'Реутов','Сколково','Тверь', 'Уфа', 'Фролы', 'Хабаровск', 'Царево', 'Челябинск', 'Шахты',
'Щекино', 'Элиста', 'Юрга'];
function game ($a){
foreach ($baza as $value) {
if($a == mb_substr($value,0,1,'utf-8')){
return $value[0];
}
}
}

assert('Астрахань' == game('А')); 

У массива $baze должна быть глобальная область видимости?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ShowPrint
ShowPrint
сообщение 5.10.2016, 14:14; Ответить: ShowPrint
Сообщение #4


Artemch, я не прям профи, но есть подозрение что массив не обязательно должен быть видим внутри функции. По крайней мере если он невидим, то вполне понятна ошибка foreach - получается undefined в качестве аргумента вместо массива. Проще проверить, сделайте отладочный

echo $baza[0];

внутри function и посмотрите что он выведет.

Как вариант без echo можно сначала попробовать и посмотреть на результат одного из двух вариантов:
- или поместить объявление массива внутрь функции;
- или передать массив второй переменной;
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Book
Book
Topic Starter сообщение 5.10.2016, 14:33; Ответить: Book
Сообщение #5


ShowPrint, Да вы правы, массив не виден внутри функции
при вводе 

echo $baza[0];

ничего не выводит.

А если проверить внутри функции

var_dump($baza)

То выводит NULL
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ShowPrint
ShowPrint
сообщение 5.10.2016, 14:34; Ответить: ShowPrint
Сообщение #6


Artemch, массив не будет виден внутри функции ))) Инфа с примером здесь>>>

Там же найдете пути решения проблемы, например посредством global


Сообщение отредактировал ShowPrint - 5.10.2016, 14:36
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Book
Book
Topic Starter сообщение 5.10.2016, 15:32; Ответить: Book
Сообщение #7


ShowPrint, Спасибо что помогли, но так и не пойму, почему проверка не проходит 
 

Warning: assert(): Assertion failed in C:\OpenServer\domains\profit.localhost\baza\data.php on line 13


<?php
function game ($a){
$baza = ['Астрахань','Брест','Владимир','Геленджик','Дмитров', 'Елань','Жуковский','Золотово','Ильино','Керчь', 'Ленск',
'Магадан', 'Находка', 'Обвинск', 'Пермь', 'Реутов','Сколково','Тверь', 'Уфа', 'Фролы', 'Хабаровск', 'Царево', 'Челябинск', 'Шахты',
'Щекино', 'Элиста', 'Юрга'];
foreach ($baza as $value) {
if($a == mb_substr($value,0,1,'utf-8')){
return $value[0];

}
}
}
assert('Астрахань' == game('А'));



Сообщение отредактировал Artemch - 5.10.2016, 15:34
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ShowPrint
ShowPrint
сообщение 5.10.2016, 15:42; Ответить: ShowPrint
Сообщение #8


Artemch, $value у вас - не массив, а строка:

return $value[0];

Если не в этом причина, то ищите: к сожалению не приходилось сталкиваться раньше с assert - не подскажу.

Могу ещё посоветовать: когда что-то не работает, то проверяйте промежуточные данные, например через echo - так можно понять что-именно не работает и раскопать причину ошибки. По крайней мере я именно так поступаю в аналогичных случаях.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Book
Book
Topic Starter сообщение 5.10.2016, 17:25; Ответить: Book
Сообщение #9


ShowPrint, Спасибо большое за помощь, буду искать
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ShowPrint
ShowPrint
сообщение 5.10.2016, 18:11; Ответить: ShowPrint
Сообщение #10


Artemch, для начала надо попробовать:

return $value;

:rolleyes:
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Помогите вспомнить рекламного бота Телеграм для обмена рекламой
0 Mixatraider 725 21.2.2024, 23:42
автор: Mixatraider
Открытая тема (нет новых ответов) Помогите рещить проблему с монитором.
Почему низкое разрешение при подключении монитора через displayport?
0 Levels 1702 11.12.2020, 0:48
автор: Levels
Открытая тема (нет новых ответов) Помогите кто нибудь получить партнерку Росбанк!
7 heisenberg_mw 2340 7.8.2020, 9:28
автор: heisenberg_mw
Открытая тема (нет новых ответов) Помогите найти тему пожалуйста
7 virtas 12479 24.7.2020, 17:02
автор: -JamesSmips-
Открытая тема (нет новых ответов) Помогите с поиском доноров
3 tehno_music 3353 4.11.2019, 17:15
автор: goblin78


 



RSS Текстовая версия Сейчас: 19.4.2024, 18:04
Дизайн