#php #arrays #file-get-contents
#php #массивы #file-get-contents
Вопрос:
Я пытаюсь создать скрипт, который покажет новый IP-адрес на основе имени состояния. IP-адреса должны быть взяты из файла с тем же именем, что и имя состояния. Затем он принимает случайный IP-адрес и присваивает его (вот как это должно работать).
Проблема в том, что он присваивает совершенно случайные IP-адреса и загружает их IP-адреса из случайного файла вместо того, чтобы брать его из правильного файла с именем состояния.
Как это должно работать: Калифорния> california.txt > случайный IP-адрес
Как это работает сейчас: Калифорния> newyork/georgia/texas/etc.txt > случайный IP-адрес
$state_content=["Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","NewHampshire","NewJersey","NewMexico","NewYork","NorthCarolina","NorthDakota","Ohio","Oklahoma","Oregon","Pennsylvania","RhodeIsland","SouthCarolina","SouthDakota","Tennessee","Texas","Utah","Vermont","Virginia","Washington","WestVirginia","Wisconsin","Wyoming"];
$country_content=["UnitedStates", "UnitedKingdom", "Canada", "Australia", "Germany", "France", "Spain"];
$a = 0;
function getStateContent($state_name) {
// checks do we already have content for this state
if(!isset($state_content[$state_name])) {
// generate file name
$file_name = "state/";
$file_name .= str_replace(" ", "", ucwords($state_name));
$file_name .= ".txt";
$state_text = file_get_contents($file_name);
$state_content[$state_name] = explode("n", $state_text);
}
return $state_content[$state_name];
}
function getStateIpByName($state_name) {
$content = getStateContent($state_name);
return $content[array_rand($content)];
}
function getCountryContent($country_name) {
// checks do we already have content for this state
if(!isset($country_content[$country_name])) {
// generate file name
$file_name = "country/";
$file_name .= str_replace(" ", "", ucwords($country_name));
$file_name .= ".txt";
$country_text = file_get_contents($file_name);
$country_content[$country_name] = explode("n", $country_text);
}
return $country_content[$country_name];
}
function getCountryIpByName($country_name) {
$content = getCountryContent($country_name);
return $content[array_rand($content)];
}
Использование:
if ($result->num_rows > 0) {
// output data of each row
echo "<div class='block'><div class='rows'>";
while($row = $result->fetch_assoc()) {
if (!empty($row["state"]) amp;amp; $row["country"] == "united states") {
$stateip = getStateIpByName($row["state"]);
$a ;
echo $stateip;
}
else if (empty($row["state"]) amp;amp; $row["country"] == "united states") {
$countryip = getCountryIpByName($row["country"]);
$a ;
echo $countryip;
}
else if ($row["country"] != "united states") {
}
}
Комментарии:
1. Смотрите эти инструкции,
$state_content[$state_name] = explode("n", $state_text);
и$country_content[$country_name] = explode("n", $country_text);
. Исходные массивы, т.е.$state_content
и$country_content
, обрабатываются / изменяются каждый раз, когда соответствующие функции вызываются изwhile
цикла.2. Я вижу. Есть идеи о том, как я могу это исправить?
3. Что содержат эти файлы? IP-адреса? Кроме того, что вы пытаетесь сделать с этими утверждениями?
4. Эти файлы содержат IP-адреса, такие как 1.1.1.1, 2.2.2.2 (по 1 на строку). Я пытаюсь вывести недавно созданные данные на страницу.
5. Я дал ответ ниже. Надеюсь, это решит вашу проблему.
Ответ №1:
Как я уже сказал в комментарии,
Эти операторы $state_content[$state_name] = explode("n", $state_text);
и $country_content[$country_name] = explode("n", $country_text);
манипулируют / изменяют исходный массив каждый раз, когда соответствующие функции вызываются из while()
цикла.
Решение таково (после обсуждения в чате)
Изменить getStateContent()
и getCountryContent()
функционирует следующим образом,
function getStateContent($state_name) {
// checks do we already have content for this state
global $state_content;
$state_name = str_replace(" ", "", ucwords($state_name));
if(in_array($state_name, $state_content)) {
// generate file name
$file_name = "state/";
$file_name .= $state_name;
$file_name .= ".txt";
$state_text = file_get_contents($file_name);
$ipaddresses = explode("n", $state_text);
return $ipaddresses;
}
}
и
function getCountryContent($country_name) {
// checks do we already have content for this state
global $country_content;
$country_name = str_replace(" ", "", ucwords($country_name));
if(in_array($country_name, $country_content)) {
// generate file name
$file_name = "country/";
$file_name .= $country_name;
$file_name .= ".txt";
$country_text = file_get_contents($file_name);
$ipaddresses = explode("n", $country_text);
return $ipaddresses;
}
}
Комментарии:
1. Он просто показывает пустую страницу с
state/California.txt
… Мне нужно просмотреть все записи с недавно назначенными IP-адресами на странице, и именно поэтому я использовалwhile
. Что-то здесь ужасно неправильно. Может быть, вы забыли оgetStateIpByName($state_name)
функции, которая извлекает случайный IP-адрес из связанного файла? Или, может быть, я просто не понимаю, как мне применить это вwhile
цикле?2. @Ricardo О, мой плохой. Я случайно сохранил
die($file_name);
эту функцию, вот почему. Я использовал это для отладки вашей проблемы. Я обновил свой ответ. И вам не нужно изменять какой-либоwhile
цикл, вам просто нужно изменить эти функции, вот и все.3. Что я должен написать в
while
цикле вместоecho $stateip;
этого? Я думаю, вы не до конца поняли вопрос. Я беру данные из своей базы данных, и мне нужно присвоить КАЖДОЙ СТРОКЕ НОВЫЙ IP-адрес из текстового файла. Я предполагаю, что то, что вы сделали, просто показывает содержимое определенного файла .txt. Где находится назначение нового IP-адреса для каждой строки базы данных?4. Пожалуйста, посмотрите в вопросительном сообщении:
How this should work: california > california.txt > random IP
. По сути, каждый разcalifornia
, когда он будет отображаться, он будет заменен случайным IPcalifornia.txt
-адресом. Таким образом, для каждого калифорнийского поля в таблице мы получаем (показанный на странице) случайный калифорнийский IP.5. @Ricardo Хорошо, итак, с этим
$stateip
$countryip
вы получаете случайный IP-адрес из файла (на основе состояния или страны в каждой итерацииwhile
цикла). Итак, что вы пытаетесь сделать с этим случайным IP-адресом?