以新闻作为例子
问题:新闻内容有标题(title)、图片(image)、文字(content)三种数据存在形式,我从HTML获取的数据是三组数组:title[]、image[]、content[];这三个数组的元素需要按顺序存进paragraphs[]中。
解决方案:
1、添加:
(1)在HTML中创建id=”paragraph_list”的div块,添加的内容class=”paragraphs”,id=”paragraph’+i+‘”,其中变量i的值为:
if($(‘.paragraphs‘).length === 0) { var i = 0; } else { var last = $(‘.paragraphs‘).last().attr(‘id‘); var i = parseInt(last.substring(9, last.length)); i = i + 1; }
在#paragraphs块里添加一个type=”hidden”,name=”xxxOrder[]”,value=””‘+i+‘””的input输入框。添加的时候在#paragraph_list最后一条子元素后面插入最新的#paragraphs
(2)php获取六组数组:$newsTitleOrder、$newsTitle、$newsContentOrder、$newsContent、$newsImageOrder、$files,进行如下处理:
$news_image = array(); for($i = 1; $i < sizeof($files); $i ++) { $imageId = $imageLogic->uploadImage($files[$i], ‘news‘); $news_image[] = array( $newsImageOrder[$i-1] => $imageId, ‘type‘ => ‘image‘ ); unset($imageId); } $news_title = array(); for($i = 0; $i < sizeof($newsTitle); $i ++) { $news_title[] = array( $newsTitleOrder[$i] => $newsTitle[$i], ‘type‘ => ‘title‘ ); } $news_content = array(); for($i = 0; $i < sizeof($newsContent); $i ++) { $news_content[] = array( $newsContentOrder[$i] => $newsContent[$i], ‘type‘ => ‘text‘ ); } $arrMerge = array_merge($news_title, $news_content, $news_image);
合并后的数组是无序的,我需要根据数组中子元素的第一个子元素的key进行排序,而且这个key可能不是连续的,因为编辑在添加的过程中可能会把前面已经添加上的内容删除了,多维数组的排序处理如下:
public function compare($arr1, $arr2) { $index1 = array_keys($arr1)[0]; $index2 = array_keys($arr2)[0]; if($index1 <= $index2) { return false; } else { return true; } } usort($arrMerge, ‘compare‘);
这下我就能得到我希望得到的结果了
2、编辑
编辑和添加略有差异,主要是图片的处理,因为如果编辑没有修改图片PHP接收的$files对应的元素为空,关键在于如何对数据库中原有图片进行取舍
(1)HTML展示原有图片的时候,需要php把原有图片id传递过来:
$paragraphs = json_decode($paragraphs); $paragraph = array(); foreach($paragraphs as $list) { if($list->type == ‘image‘) { $paragraph[] = array( ‘id‘ => $list->id, ‘type‘ => $list->type, ‘content‘ => $imageLogic->getImageUrl($list->id) ); } else { $paragraph[] = array( ‘type‘ => $list->type, ‘content‘ => $list->content ); } }
在图片的.paragraphs块里添加type=”hidden”,name=”oldImageId[]”,vlaue={{原有图片id}}的input输入框
(2)php接收的时候会多一个数组$oldImageId,创建新图片数组的时候只要加一个判断:
$news_image = array(); for($i = 1; $i < sizeof($files); $i ++) { if($files[$i]->getName()) { $news_image[] = array( $newsImageOrder[$i-1] => $imageLogic->uploadImage($files[$i], ‘news‘), ‘type‘ => ‘image‘ ); } else { $news_image[] = array( $newsImageOrder[$i-1] => $oldImageId[$i-1], ‘type‘ => ‘image‘ ); } }
其他的与添加一致