#php
#php
Вопрос:
Я пытаюсь создать скрипт, который будет загружать пользователей из таблицы базы данных и прикреплять новый случайный IP-адрес к каждому пользователю в зависимости от его состояния.
Проблема в том, что я написал много кода, и предстоит еще много работы по копированию / вставке, если я буду придерживаться этого подхода.
Может ли кто-нибудь указать мне правильное направление, как правильно это сделать?
Итак, сначала у меня есть 50 таких:
$California_Text = file_get_contents('state/California.txt');
$California_textArray = explode("n", $California_Text);
$Idaho_Text = file_get_contents('state/Idaho.txt');
$Idaho_textArray = explode("n", $Idaho_Text);
$Illinois_Text = file_get_contents('state/Illinois.txt');
$Illinois_textArray = explode("n", $Illinois_Text);
$Indiana_Text = file_get_contents('state/Illinois.txt');
$Indiana_textArray = explode("n", $Indiana_Text);
$Iowa_Text = file_get_contents('state/Iowa.txt');
Тогда у меня есть 50 таких:
while($row = $result->fetch_assoc()) {
if (isset($row["state"])) {
foreach ($row as $value){
$California_randArrayIndexNum = array_rand($California_textArray);
$p_California = $California_textArray[$California_randArrayIndexNum];
$Texas_randArrayIndexNum = array_rand($Texas_textArray);
$p_Texas = $Texas_textArray[$Texas_randArrayIndexNum];
$Alabama_randArrayIndexNum = array_rand($Alabama_textArray);
$p_Alabama = $Alabama_textArray[$Alabama_randArrayIndexNum];
$Alaska_randArrayIndexNum = array_rand($Alaska_textArray);
$p_Alaska = $Texas_textArray[$Alaska_randArrayIndexNum];
$Arizona_randArrayIndexNum = array_rand($Arizona_textArray);
$p_Arizona = $California_textArray[$Arizona_randArrayIndexNum];
.....
Тогда у меня есть 50 таких:
if ($row["state"] == "california") {
$stateip = $p_California;
}
else if ($row["state"] == "texas") {
$stateip = $p_Texas;
}
else if ($row["state"] == "alabama") {
$stateip = $p_Alabama;
}
else if ($row["state"] == "alaska") {
$stateip = $p_Alaska;
}
Я почти уверен, что это плохой подход.. Может быть, есть способ сделать все это примерно с 3 строками foreach
?
Ответ №1:
Что-то вроде этого:
// holds your content
$state_content = [];
while($row = $result->fetch_assoc()) {
// check do we have state set
if (!empty($row["state"])) {
$stateip = getStateIpByName($row["state"]);
}
}
/**
* Returns random IP
*/
function getStateIpByName($state_name) {
$content = getStateContent($state_name);
return $content[array_rand($content)];
}
/**
* Returns your's state content by state name
*/
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];
}
Возможно, есть некоторые ошибки, но вы получите представление.
Комментарии:
1.
getStateContent($state_name) {
выдает aParse error: syntax error, unexpected '{' in
, и я не могу понять, почему это происходит.2. Я пропустил функцию, может быть, в этом и была проблема? getStateContent предназначен для извлечения вашего содержимого из текстового файла. Он будет делать это, когда вы зацикливаете записи для каждого состояния. Возможно, вам нужно будет внести некоторые исправления здесь, я предположил, что ваши файлы имеют те же имена, что и состояния в базе данных, только с первой заглавной буквой.
3. Это сработало как шарм, но теперь есть небольшая проблема:
Warning: file_get_contents(state/.txt)
amp;Warning: file_get_contents(state/New york.txt)
. В основном в некоторых случаях он пытается загрузить файл без имени (у меня нет нулевых переменных), а иногда пытается загрузить файлы состояния с пробелом в их имени, но мои переменные состояния выглядят так:NewYork
(без пробела). Есть идеи, как это исправить?4. Только что сделал несколько обновлений. Я заменил isset($row[«state»]) на empty($row[«state»]) и удалил пробел из имени состояния.
Ответ №2:
Сохраняйте все состояния в массиве и выполняйте все операции внутри foreach
блока
$states=['california',..];
foreach($states as $state){
//Your code for one state
//Replace state name with $state variable
}
Комментарии:
1. Мне нравится этот подход, но как мне изменить, скажем
$XXX_Text
, так, чтобы он выглядел так$California_Text
? Вы сказали «//Заменить имя состояния на $state variable», но я думаю, если я это сделаю$state_Text
, это просто создаст новую переменную вместо создания новой для каждого состояния?