манипулировать мульти-массивами - PullRequest
1 голос
/ 05 августа 2011

Я извлекаю некоторые данные из таблицы MySQL через:

$result = mysql_query("SELECT characters_ID, name, borndate, deathdate, marrieddate, ispregnant FROM characters WHERE isfemale='1'",$db);
$femaledata = array();

while ($row_user = mysql_fetch_assoc($result))
$femaledata[] = $row_user;

Это дает мне массив, который выглядит следующим образом:

Array ( 
    [0] => Array ( [characters_ID] => 2 [name] => Helene [borndate] => 35 [deathdate] => 431 [marrieddate] => 157 [ispregnant] => 0 ) 
    [1] => Array ( [characters_ID] => 4 [name] => Isabelle [borndate] => 161 [deathdate] => [marrieddate] => 303 [ispregnant] => 1 ) 
    [2] => Array ( [characters_ID] => 7 [name] => Helene [borndate] => 326 [deathdate] => [marrieddate] => [ispregnant] => 0 ) 
    [3] => Array ( [characters_ID] => 72 [name] => Faylinn [borndate] => 335 [deathdate] => [marrieddate] => [ispregnant] => 0 ) 
    [4] => Array ( [characters_ID] => 74 [name] => Relina [borndate] => 349 [deathdate] => [marrieddate] => [ispregnant] => 0 ) 
    )

Теперь мне нужно удалить все символы, которые имеют значение для deathdate или ispregnant, а затем мне нужно запустить какой-то код на других. Например, мне нужно взять значение Borndate, сравнить его с текущей датой, чтобы найти возраст, и частично основываясь на возрасте, мне нужно запустить код для каждого, чтобы определить, забеременела ли персонаж на терне.

Прошу прощения за то, что это кажется давним вопросом Многомерные массивы все еще меня смущают.

Редактировать: (вопрос должен быть более ясным)

Не могли бы вы предложить лучший способ, которым я бы взорвал или разбил массив, а затем сделал бы условное изменение данных, или вместо этого, как я мог бы удалить ненужные данные и затем сделать условное изменение данных.

Мой конечный результат здесь - взять подходящих персонажей женского пола (уже не мертвых и не беременных) и, исходя из их возраста, дать им шанс забеременеть. Если это правда, я бы добавил код в базу данных SQL для обновления этого символа.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 05 августа 2011

Все, что вам нужно, возможно, можно сделать с помощью SQL:

Теперь мне нужно удалить любых персонажей, которые имеют значение для deathdate или ispregnant

Просто добавьте аргумент к условию WHERE:

isPregnant IS NULL AND deathdate IS NULL

Например, мне нужно взять значение borndate, сравнить его с текущая дата, чтобы найти возраст

В зависимости от формата вашего поля математика может быть выполнена в SQL, обратите внимание на функцию DATE в mysql

Не стоит недооценивать мощность вашего sql-сервера, в 99% случаев он, вероятно, быстрее, чем php, работает с набором данных.

1 голос
/ 05 августа 2011

Вместо этого, если сразу удалить некоторые строки из вашего массива, попробуйте ограничить данные, которые вы получаете через SQL.

Вы можете перебрать свой массив следующим образом:

foreach($femaledata as $female)
{
 echo $female['name'];
}
0 голосов
/ 05 августа 2011

TJHeuvel дал вам правильный ответ, и вы должны принять этот ответ. Однако, чтобы сообщить: многомерные массивы не должны смешиваться. Дай мне посмотреть, смогу ли я объяснить.

В PHP вы можете поместить любой объект в массив, включая другие массивы. Итак, допустим, у вас есть массив, который содержит другие массивы. Когда вы выполняете итерацию по этому массиву, используя циклическую конструкцию (обычно цикл foreach), каждая итерация цикла даст вам другой массив; если вы хотите получить доступ к элементам этого подмассива , просто зациклите его. Это называется вложенным циклом. Пример:

$r = array(
        array(1,2,3),
        array(4,5,6),
        array(7,8,9)
    );

foreach ($r as $cur)  {
    foreach ($cur as $num)  {
        echo $num;
    }
}

В каждой итерации внешнего цикла $cur содержит массив; внутренний цикл перебирает содержимое этого массива. Этот метод позволяет обрабатывать массивы любого размера.

Однако в вашем конкретном случае вам не нужно использовать внутренний цикл для перебора ваших подмассивов. Вам нужно только получить доступ к определенным элементам ваших подмассивов по их ключам, а не обрабатывать их все по очереди. Итак, простой цикл foreach подойдет.

0 голосов
/ 05 августа 2011

ты имеешь в виду что-то подобное?

          $femaledata = array();
          while ($row_user = mysql_fetch_assoc($result)) {
               $ok = false;
               // do you validation for every user 

               if($ok) array_push($femaledata,$row_user);
          }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...