Минимизируйте усилия с помощью foreach

#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) { выдает a Parse 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 , это просто создаст новую переменную вместо создания новой для каждого состояния?