php :: сократить эту функцию?:: манипулирование массивом - PullRequest
0 голосов
/ 04 октября 2010


Итак, у меня есть функция, как описано ниже,
Я считаю, что это слишком долго и может быть сокращено.
Я думаю, что упал в части манипулирования массивом.
Пожалуйста, игнорируйте странный синтаксис базы данных

<ч /> Так что в основном этой функции присваивается строка, подобная этой

abc, def, ghi, jkl, mno

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

abc, def, ghi, jkl, mno,

Функция должна преобразовать строку, чтобы она выглядела как

'abc', 'def', 'ghi', 'jkl', 'mno' ($ groups)

Строка затем используется в запросе выбора.

ВЫБЕРИТЕ имя группы в качестве имени ОТ группы контактов, ГДЕ имя группы В ($ groups);

Мы используем array_diff() в исходном массиве и массиве из запроса select.
Это даст нам массив всех групп, которые мы используем, которые не существуют. ($ Создать)

Далее мы перебираем массив и создаем группы

foreach($create as $group){
  $values = array(
    'user_id', $_SESSION['user_id'],
    'group_name', $group
  );
  $this->database->insert_query($values, 'contact_groups');
}

Теперь мы снова делаем запрос на выборку, но на этот раз мы делаем это, чтобы получить идентификаторы групп

ВЫБРАТЬ group_id в качестве идентификатора ОТ группы контактов, ГДЕ имя_группы IN ($ groups);

И, наконец, мы перебираем идентификаторы групп и добавляем их в другую таблицу.

<ч />
private function groups($groups){
  $groups = split(', ', $groups);
  $intersect = array();
  $db_rows = array();

  foreach($groups as &$group)
    $group = trim(str_replace (',', '', $group)); //remove any rogue spaces or commas

  $groupsq = $groups;
  foreach($groupsq as &$group)
    $group = '\''.$group.'\'';

  $groupsq = implode(', ', $groupsq);
  $q = "SELECT group_name as name FROM contact_groups WHERE group_name IN($groupsq);";
  $r = $this->database->results($this->database->query($q));
  while($row = mysql_fetch_assoc($r)) {
    $intersect[] = $row;
  }

  //create a list of non-existent groups
  $create = array_diff($groups, $intersect);

  foreach($create as $group){
    $values = array(
      'user_id', $_SESSION['user_id'],
      'group_name', $group
    );

    $this->database->insert_query($values, 'contact_groups');
    $this->database->query($q);
  }

  $q = "SELECT group_id as id FROM contact_groups WHERE group_name IN($groupsq);";
  $r = $this->database->results($this->database->query($q));
  while($row = mysql_fetch_assoc($r)) {
    $db_rows = $row;
  }

  foreach($db_rows as $group){
    $values = array(
      'group_id' => $group,
      'contact_id' => $this->contact_id
    );

    $q = $this->database->insert_query($values, 'contact_groups_link');
    $this->database->query($q);
  }
}

1 Ответ

0 голосов
/ 04 октября 2010

Ну, гораздо более короткая функция для первых нескольких шагов:

/**
 @param string like bla, bla, bla, bla,
 @return string like "bla", "bla", "bla"
*/
function blablabla($string){
    return rtrim(preg_replace('/([a-z]+)/', '"\1"', $string), ',');   
}

Что касается остальной части вашего кода, я не совсем уверен, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...