【问题标题】:Compare two different array keys, then do something with the values that dont exist in the 1st array比较两个不同的数组键,然后对第一个数组中不存在的值做一些事情
【发布时间】:2011-09-21 14:34:31
【问题描述】:

数组似乎是我不想点击的主题之一。在 SQL 中似乎更容易......我希望你能提供帮助..

我有两个数组,我希望比较键布局完全不同,我希望比较 *$first_array->place->name* 和 *$second_array->post_name* 如果第一个数组中的值不'在第二个中不存在,然后我想对此做点什么,可能是一个插入语句。

  $first_array=simplexml_load_file('xml/file.xml'); // Load an XML file
   echo "<p>Check we are getting a value from the 1st array: ".$first_array->place[0]->name."</p>";
    //echo"<pre>";
    //var_dump($first_array);
    //echo"</pre>";

 $second_array=get_pages(); // Get a list of Posts from WP
   echo "<p>Check we are getting a value from the 2nd array: ".$second_array[0]->post_name."</p>";
    //echo"<pre>";
    //var_dump($second_array);
    //echo"</pre>";

从第一个数组..

object(SimpleXMLElement)#99 (1) {
  ["place"]=>
  array(5) {
    [0]=>
    object(SimpleXMLElement)#101 (14) {
      ["name"]=>
  string(5) "China"

来自第二个数组..

array(6) {
  [0]=>
  object(stdClass)#199 (24) {
    ["post_title"]=>
    string(5) "Japan"

更多

  [1]=>
  object(stdClass)#197 (24) {
    ["post_title"]=>
    string(5) "China"

更多

  [2]=>
  object(stdClass)#197 (24) {
    ["post_title"]=>
    string(6) "Israel"

明显的区别是日本和以色列

进度更新#1

我得到了一个阶段,我有两个结果确实存在的记录,但我想要 XML 文件中存在的记录的不同列表,但 DO NOT 存在于 $ second_array:

<?php 

  $xml = simplexml_load_file('xml/regions.xml');
   // echo "<p>".$xml->place[0]->name."</p>";
    echo"<pre>";
    var_dump($xml);
    echo"</pre>";

 $args = array('post_type' => 'page','child_of' => 20,'exclude' => 22);
 $wparray=get_pages($args);
   // echo  "<p>".$wparray[0]->post_name."</p>";
    echo"<pre>";
    var_dump($wparray);
    echo"</pre>";

 foreach($xml as $yregions_places) { 
  for($j=0;$j<count($wparray);$j++) {
   if($yregions_places->name==$wparray[$j]->post_title) { 
    echo "<p style=\"color:green;\">".$yregions_places->name."<p>"; } 
   }
  }

?>

有人可以帮我进入下一个阶段吗?我真的很努力!

进度更新#2

根据 Brian 的指示,我已经管理好我认为我将两组数据都放在了一个数组中:

 $yregions_xml = (array)simplexml_load_file('xml/regions.xml');
  // echo"<pre>";
  // var_dump($yregions_xml);
  // echo"</pre>";
  $yregions_xml = array_pop($yregions_xml);
   for($j=0;$j<count($yregions_xml);$j++) {
    echo "<p style=\"color:purple;\">".(trim(strtolower($yregions_xml[$j]->name)))."</p>";
   }

 $wpargs = array('post_type' => 'page','child_of' => 20,'exclude' => 22);
 $wparray=get_pages($wpargs);
  // echo"<pre>";
  // var_dump($wparray);
  // echo"</pre>";
  for($j=0;$j<count($wparray);$j++) {
    echo "<p style=\"color:green;\">".(trim(strtolower($wparray[$j]->post_name)))."</p>";

所以我不需要做一些比较吗?

进度更新#3

//store XML data in SimpleXMLObject
$xml = simplexml_load_file('xml/file.xml'); 
$first_array=array_pop($yregions_xml);

//initiate arrays
$first_array = array();
$second_array = array();

//populate arrays with object data that interests us
foreach($xml->place as $place){
    foreach($place as $name){
    $first_array[] = $name;
    echo "<p style=\"color:green;\">".$name."</p>";
 }
}

$wpargs = array('post_type' => 'page','child_of' => 20,'exclude' => 22);
foreach(get_pages($wpargs) as $page){
    $second_array[] = $page->post_title;
    echo "<p style=\"color:red;\">".$page->post_title."</p>";
}

//perform comparison    
$unique_to_first_array = array_diff($first_array,$second_array);
echo "<pre>";
var_dump($unique_to_first_array);
echo "</pre>";

//now do your SQL, etc with this new array

完成的代码

我把所有的进展都留在了那里,所以每个人都可以看到正在进行的工作,希望这对其他人有更多帮助。我知道我一直在为此苦苦挣扎。感谢 @brian_d 和 @rrapuya 提供完整和评论的帮助答案。

// store XML data in SimpleXMLObject
   $xml = simplexml_load_file('xml/file.xml'); 

// initiate arrays
   $first_array = array();
   $second_array = array();

// populate arrays with object data that interests us
   foreach($xml->place as $place){
    foreach($place->name as $name){
     $first_array[] = $name;
     // echo "<p style=\"color:green;\">".$name."</p>";
    }
   }

   $wpargs = array('post_type' => 'page','child_of' => 20,'exclude' => 22);
    foreach(get_pages($wpargs) as $page){
     $second_array[] = $page->post_title;
     // echo "<p style=\"color:red;\">".$page->post_title."</p>";
    }

// perform comparison    
   $unique_to_first_array = array_diff($first_array,$second_array);
    echo "<pre>";
    var_dump($unique_to_first_array);
    echo "</pre>";

//now do your SQL, etc with this new array

【问题讨论】:

  • 您意识到这些是您要比较的对象,而不是数组?
  • @brian_d 感谢您的指点

标签: php xml arrays wordpress


【解决方案1】:

我希望这会有所帮助。两个关键点是从对象数据中填充数组,然后使用 PHP 函数 array_diff 获取仅在第一个数组中找到的值。

//store XML data in SimpleXMLObject
$xml = simplexml_load_file('xml/file.xml'); 

//initiate arrays
$first_array = array();
$second_array = array();

//populate arrays with object data that interests us
foreach($xml->place as $place){
    foreach($place as $name){
        $first_array[] = (string)$name;
    }
}

foreach(get_pages() as $page){
    $second_array[] = $page->post_title;
}

//perform comparision    
$unique_to_first_array = array_diff($first_array, $second_array);

//now do your SQL, etc with this new array

【讨论】:

  • 我在$second_array[] = $page-&gt;post_title;这一行添加了缺少的分号,我想我应该看到另一个新的数组有差异?结果是array(0) { },所以我猜你提供的代码是故意不完整的?我需要阅读的你的短语是从对象数据填充你的数组
  • @Stuart 代码不是故意不完整的。我已经调整了我认为现在应该工作的第一个 foreach 循环。每个名称都是一个 SimpleXMLElement 对象,它位于另一个 SimpleXMLElement 对象(位置)内的名称数组中。如果这仍然不起作用,您能否显示一些实际的 xml 文件?谢谢。
  • 抱歉,我已经习惯了获取指针,有时看起来很容易接受。在您的第一篇文章中,xml 循环部分在 foreach 循环中回显时产生了一个名称。这个修订没有产生任何结果。 array(1) { ["place"]=> array(5) { [0]=> object(SimpleXMLElement)#101 (14) { ["woeid"]=> string(8) "28362579" ["placeTypeName" ]=> string(6) "Region" ["name"]=> string(11) "Nordjylland"
  • 第一个循环肯定有问题。它不只是检查“名称”键,而是在最终数组中给出 66 个差异的列表。我已经更新了上面的进度。
【解决方案2】:

试试这个
foreach ($first_array as $arrobj ){

for($j=0;$j<count($second_array);$j++){
    if($arrobj->place->name ==$second_array[$j]->post_title){
        //do query here
    }else{
    //do query here

    }
}

}

【讨论】:

  • 我没有得到任何匹配,我添加了 cmets 以尝试更好地理解它,并修剪并转换为小写以防万一出现问题。如果我的 cmets 不正确,我会重视更正。
  • 我不认为这是正确的方法,它确实给了我一个匹配的值列表,但没有给我一个不存在的值的不同列表。
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2021-06-16
  • 2020-10-16
  • 1970-01-01
相关资源
最近更新 更多