Перейти к содержимому

Сервис обмена электронных валют


Помогите с функцией

#1 Artemch

Artemch
  • Пользователь
  • 10 сообщений
  • Репутация: 0
0

Отправлено 05 Октябрь 2016 - 12:15

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

$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

#2 ShowPrint

ShowPrint
  • Пользователь PRO
  • 1 703 сообщений
  • Репутация: 405

Отправлено 05 Октябрь 2016 - 12:27

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

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

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

 

UPD:

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


Сообщение отредактировал ShowPrint: 05 Октябрь 2016 - 12:31

  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#3 Artemch

Artemch
    Topic Starter
  • Пользователь
  • 10 сообщений
  • Репутация: 0

Отправлено 05 Октябрь 2016 - 13:04

@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 должна быть глобальная область видимости?


  • 0

#4 ShowPrint

ShowPrint
  • Пользователь PRO
  • 1 703 сообщений
  • Репутация: 405

Отправлено 05 Октябрь 2016 - 13:14

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

echo $baza[0];

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

 

Как вариант без echo можно сначала попробовать и посмотреть на результат одного из двух вариантов:

- или поместить объявление массива внутрь функции;

- или передать массив второй переменной;


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#5 Artemch

Artemch
    Topic Starter
  • Пользователь
  • 10 сообщений
  • Репутация: 0

Отправлено 05 Октябрь 2016 - 13:33

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

при вводе 

echo $baza[0];

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

 

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

var_dump($baza)

То выводит NULL


  • 0

#6 ShowPrint

ShowPrint
  • Пользователь PRO
  • 1 703 сообщений
  • Репутация: 405

Отправлено 05 Октябрь 2016 - 13:34

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

 

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


Сообщение отредактировал ShowPrint: 05 Октябрь 2016 - 13:36

  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#7 Artemch

Artemch
    Topic Starter
  • Пользователь
  • 10 сообщений
  • Репутация: 0

Отправлено 05 Октябрь 2016 - 14:32

@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: 05 Октябрь 2016 - 14:34

  • 0

#8 ShowPrint

ShowPrint
  • Пользователь PRO
  • 1 703 сообщений
  • Репутация: 405

Отправлено 05 Октябрь 2016 - 14:42

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

return $value[0];

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

 

Могу ещё посоветовать: когда что-то не работает, то проверяйте промежуточные данные, например через echo - так можно понять что-именно не работает и раскопать причину ошибки. По крайней мере я именно так поступаю в аналогичных случаях.


  • 1
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#9 Artemch

Artemch
    Topic Starter
  • Пользователь
  • 10 сообщений
  • Репутация: 0

Отправлено 05 Октябрь 2016 - 16:25

@ShowPrint, Спасибо большое за помощь, буду искать


  • 0

#10 ShowPrint

ShowPrint
  • Пользователь PRO
  • 1 703 сообщений
  • Репутация: 405

Отправлено 05 Октябрь 2016 - 17:11

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

return $value;

:rolleyes:


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru