#php #mysql #arrays
#php #mysql #массивы
Вопрос:
Я застрял, работая над проблемой, и был бы признателен за некоторые рекомендации. Я работаю со старой системой, которая была ужасно закодирована и не выполняла никакой проверки или очистки пользовательского ввода, поэтому база данных, с которой я работаю, немного не в порядке.
У меня проблемы с одним столбцом под названием «теги», используемым для тегов для статей. Но каждая строка выглядит следующим образом и варьируется между ними:
тег tag1 tag2 tag3
или
tag1, tag2, tag
Но мне нужно объединить их и поместить в массив, в котором они перечислены по количеству повторений каждого из них, вот так:
- тег (2)
- tag1(2)
- tag2(2)
- tag3(1)
Поскольку я не самый сведущий в php, я не уверен, правильно ли я подхожу к проблеме?
Я новичок в манипулировании массивами такого масштаба, поэтому я застрял на этом этапе. Вы можете просмотреть приведенный ниже пример того, что я делаю ниже:
$sql = "SELECT tags, approved FROM articles WHERE approved = '1' ";
$result = mysql_query($sql);
while( $rows = mysql_fetch_array($result) ) {
$arr = $rows['tags'];
$arr = str_replace(", ", " ", $arr); // attempting to clean up the data, so that each word appends with a space.
$arr = str_replace(" ", " ", $arr);
// Don't know what to do next, or if this is even the right way to do it.
}
Любая помощь приветствуется.
Спасибо, Леа
Комментарии:
1. Я думаю, что я застрял, потому что скрипт выводит массив для каждой строки, и я не уверен, как приступить к манипулированию, и все мои попытки за последний час потерпели неудачу
2. Вы можете преобразовать строку в массив с помощью
explode
функции.3. @FrustratedWithFormsDesigner — Верно, но это не имеет отношения к способу форматирования каждой строки данных. Он помещает его в массив, подобный: array() { [0] => tag, tag1, tag3, tag4 [1] => tag, tag2, tag6, tag7 }
Ответ №1:
Возможно, это будет полезно. Измените свой код, чтобы для каждого запроса было $tagArr
. Если вам нужен полный массив тегов, это было бы немного по-другому, но его можно легко закодировать, используя следующее.
while( $rows = mysql_fetch_array($result) ) {
$arr = $rows['tags'];
$arr = str_replace(", ", " ", $arr); // attempting to clean up the data, so that each word appends with a space.
// Don't know what to do next, or if this is even the right way to do it.
$tagArr = array();
$current_tags = explode(" ", $arr);
foreach($current_tags as $tag) {
if(!array_key_exists($tag, $tagArr)) {
$tagArr[$tag] = 1;
} else {
$tagArr[$tag] = $tagArr[$tag] ;
}
}
// now $tagArr has the tag name as it's key, and the number of occurrences as it's value
foreach($tagArr as $tag => $occurrences) {
echo $tag . '(' . $occurrences . ')<br />';
}
}
Комментарии:
1. Нет необходимости в str_replace пробел с помощью строки.
2. @Lea обновил код. Я только что просмотрел новый
$tagArr
массив и повторил информацию. Также удалено ненужноеstr_replace
.3. Аарон В. — Теперь я понимаю. Спасибо за вашу помощь:)