#php #arrays #multidimensional-array
#php #массивы #многомерный массив
Вопрос:
Я пытаюсь создать форму, в которой пользователь вводит данные из строки, и форма получит подмножества данных через json src на основе входных данных, создаст многомерный массив и сохранит его в базе данных. Если входные данные были ранее добавлены в базу данных, я не хочу, чтобы они добавлялись в массив снова.
Вот как выглядит мой код:
//SET UP the Array
$thisquery_themes[] = array(
strtolower($themename) => array(
"author"=>$data['Author'],
"desc"=>$data['Description'],
"screenshot"=> $screenshot,
"link"=> $data['URI'],
"count"=> 1
)
);
//Get Previously saved data
$existing_themes = get_option('top_themes');
if(!empty($existing_themes)){
foreach ($existing_themes as $group){
foreach(array_keys($group) as $key) {
if($group[strtolower($themename)] == strtolower($themename)){
unset($group[$key][strtolower($themename)]);
}
}
}
$total_themes= array_merge($existing_themes , $thisquery_themes);
update_option('top_themes', $total_themes);
} else {
update_option('top_themes', $thisquery_themes);
}
его нет. если ключ существует в массиве, данные все еще добавляются в массив:
Array (
[0] => Array (
[towfiq-i._v5] => Array (
[author] => Towfiq I.
[desc] => Towfiq I. official website.
[count] => 1
)
)
[1] => Array (
[towfiq-i._v5] => Array (
[author] => Towfiq I.
[desc] => Towfiq I. official website.
[count] => 1
)
)
[2] => Array (
[wp-bangla] => Array (
[author] => Ifty Rahman
[desc] => A website template for wpbangla
[count] => 1
)
)
[3] => Array (
[towfiq-i._v5] => Array (
[author] => Towfiq I.
[desc] => Towfiq I. official website.
[count] => 1
)
)
[4] => Array (
[wp-bangla] => Array (
[author] => Ifty Rahman
[desc] => A website template for wpbangla
[count] => 1
)
)
Но я хочу, чтобы это было так (обратите внимание, как суммируется значение поля «count». дайте мне знать, если это возможно):
Array (
[0] => Array (
[towfiq-i._v5] => Array (
[author] => Towfiq I.
[desc] => Towfiq I. official website.
[count] => 3
)
)
[1] => Array (
[wp-bangla] => Array (
[author] => Ifty Rahman
[desc] => A website template for wpbangla
[count] => 2
)
)
Любая помощь была бы высоко оценена. Спасибо
Ответ №1:
Зачем вы используете массив внутри массива, если он будет содержать только одно значение? Если это не то, что вам навязывают, ваша структура может легко выглядеть как:
Array (
[towfiq-i._v5] => Array (
[author] => Towfiq I.
[desc] => Towfiq I. official website.
[count] => 3
)
[wp-bangla] => Array (
[author] => Ifty Rahman
[desc] => A website template for wpbangla
[count] => 2
)
)
Тогда ваш мир стал бы намного проще, потому что вы могли бы проверить, существует ли элемент массива, используя isset($existing_themes[strtolower($themename)])
(в качестве примера.)
Если вы не можете изменить способ получения $existing_themes
, вы можете переформатировать данные следующим образом:
$existing_themes_mod = array();
foreach ($existing_themes as $t) {
$existing_themes_mod[key($t)] = reset($t);
}
Это должно дать вам достаточную стратегию для работы с возможностью запуска «обновления» существующих записей вместо дополнения. Если вам нужна помощь в его написании, пожалуйста, сначала покажите мне вашу попытку.
РЕДАКТИРОВАТЬ — Спасибо за вставку вашего кода. Кстати, вам следует следить за всеми этими пробелами … вот лучший способ достичь вашей цели
if (!empty($existing_themes)) {
if (isset($existing_themes[strtolower($themename)])) {
if (isset($existing_themes[strtolower($themename)]['count'])) {
$existing_themes[strtolower($themename)]['count'] = $existing_themes[strtolower($themename)]['count'] 1;
} else {
$existing_themes[strtolower($themename)]['count'] = 1;
}
$thisquery_themes = array();
}
$total_themes= array_merge($existing_themes , $thisquery_themes);
update_option('top_themes', $total_themes);
} else {
update_option('top_themes', $thisquery_themes);
}
Причина, по которой ваша попытка не сработала, заключается в том, что когда вы пытаетесь изменить $value
, увеличив его на 1, это не изменяет исходный массив. Когда вы используете foreach
подобное, вам нужно выполнить итерацию по ссылке, иначе вы не сможете изменить значение. Вы делаете слишком много работы для себя!
Комментарии:
1. Отлично. Не знаю, почему я так усложнял структуру массива.. спасибо, что указали на это. Я принял ваше предложение и решил проблему с дублирующейся записью. единственная проблема, с которой я сталкиваюсь, это обновить поле count. Вот как выглядит мой код: pastebin.com/qBSH91Js . Спасибо