2010-01-17 4 views
1

J'utilise actuellement SimpleXML pour lire un fichier xml afin de générer mon premier tableau. Ce tableau affiche une liste d'images trouvées dans un répertoire et écrites dans un fichier xml.Comment ajouter des éléments manquants de deux tableaux au premier tableau

Cela a fonctionné pour moi dans le passé jusqu'à ce que je télécharge de nouvelles photos sur le même album. J'aime savoir ce que l'on fait pour obtenir une liste complète des images téléchargées à la fin de ce premier tableau. Aucune suggestion?

fichier 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 pour obtenir tableau:

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

Ce que je veux pour mes résultats:

<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> 

Numérisation répertoire pour toutes les images:

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>'; 
} 

Ce que je voudrais obtenir des résultats en utilisant les deux tableaux:

<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> 

Les 3 dernières images qui manquent dans le fichier xml serait ajouté à la fin de la liste.

+0

Pourquoi ne pas simplement ajuster le fichier XML? –

+0

Vous savez ce que Anon, c'est la solution au vrai problème. – Anurag

Répondre

1

Peut-être que cela fonctionnera pour vous?

<?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>'; 
} 

?> 

Cela suppose que $image du $xml->image et $filename de votre recherche dir sont formatés même. D'après ce que vous avez montré, ils le sont. Si ce n'est pas le cas, il devrait être assez facile de les passer à travers une regex rapide pour les amener dans un état où ils sont comparables.

Tout ce à quoi il ressemble array_diff() est ce que vous cherchez.

+0

Belle, qui a fonctionné comme un charme et il était facile à mettre en œuvre avec ce que j'avais déjà .. Merci – Tim

1

Si vous obtenez une liste complète des noms de fichiers dans le répertoire vous pouvez utiliser PHP in_array et rechercher dans un tableau de vos chemins

$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>'; 
} 
Questions connexes