Как добавить недостающие элементы из двух массивов в первый массив - PullRequest
1 голос
/ 18 января 2010

В настоящее время я использую SimpleXML для чтения файла XML для создания моего первого массива. Этот массив отображает список изображений, которые находятся в каталоге и записаны в файл XML.

Это работало для меня в прошлом, пока я не загрузил новые фотографии в тот же альбом. Мне нравится знать, что нужно сделать, чтобы получить полный список изображений, которые были загружены в конец этого первого массива. Есть предложения?

XML-файл:

<album>
<image path="/albums/1/images/100_4124.jpg" />
<image path="/albums/1/images/100_4307.jpg" />
<image path="/albums/1/images/100_4335.jpg" />
</album>

SimpleXML для получения массива:

$xml = simplexml_load_file('/albums/1/photos.xml');
foreach ($xml->image as $image)  {
    echo '<li><img src="'.$image.'"></li>';
}

Что я получаю за свои результаты:

<li><img src="/albums/1/images/100_4124.jpg"></li>
<li><img src="/albums/1/images/100_4307.jpg"></li>
<li><img src="/albums/1/images/100_4335.jpg"></li>

Сканирование каталога для всех изображений:

if ($handle = @opendir('/albums/1/')) {
    $filenames = array();
    while (false !== ($file = readdir($handle))) {
        $ext = substr($file, strrpos($file, '.') + 1);
        if ($file != '.' && $file != '..') {
            $filenames[] = $file;
            $total++;
        }
    }
}
closedir($handle);

foreach ($filenames as $filename) {
    echo '<li><img src="'.$filename.'"></li>';
}

Что бы я хотел получить за результаты, используя оба массива:

<li><img src="/albums/1/images/100_4124.jpg"></li>
<li><img src="/albums/1/images/100_4307.jpg"></li>
<li><img src="/albums/1/images/100_4335.jpg"></li>    

<li><img src="/albums/1/images/100_9000.jpg"></li>
<li><img src="/albums/1/images/100_9001.jpg"></li>
<li><img src="/albums/1/images/100_9002.jpg"></li>

Последние 3 изображения, отсутствующие в файле XML, добавят его в конец списка.

Ответы [ 2 ]

1 голос
/ 18 января 2010

Возможно, это подойдет вам?

<?php

$images = array();

foreach ($xml->image as $image) {
    $images[] = $image;
}

foreach (array_diff($filenames, $images) as $image) {
    $images[] = $image;
}

foreach ($images as $image) {
    echo '<li><img src="' . $image . '" /></li>';
}

?>

Предполагается, что $image из $xml->image и $filename из вашего поиска в каталоге отформатированы одинаково. Из того, что вы показали, они есть. Если они не должны быть достаточно легкими, чтобы провести их через быстрое регулярное выражение, чтобы привести их в состояние, в котором они сопоставимы.

Любой, на кого это похоже array_diff() - это то, что вы ищете.

1 голос
/ 18 января 2010

Если вы получите полный список имен файлов в каталоге, вы можете использовать PHP in_array и искать его в массиве ваших путей

$paths = array();
foreach ($xml->image as $image) {
    $paths[] = $image['path'];
}
foreach ($filenames as $filename) {
    if (!in_array($filename, $paths) {
        $newImage = $xml->addChild('image');
        $newImage->addAttribute('path', $filename);
    }
}

//  save adjusted xml file, assuming you have permission
$xml->asXML('/albums/1/photos.xml');
foreach ($xml->image as $image)  {
    echo '<li><img src="'.$image.'"></li>';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...