从两个不同来源排序数据(PHP)

时间:2012-09-19 14:59:18

标签: php arrays object

我需要组合两种不同的数据类型,一个数组和一个数组对象。

然后我需要按照某个属性(日期)的顺序在页面上显示它们。

访问标记类似于以下内容:

foreach($array as $item){
$item['date'];
}

foreach($object as $item){
$item->post->date
}

是array_merge我需要什么,或者不同的东西?

如果可能的话,我不想这样做,因为数据会快速变化而且不需要存储。

谢谢!

4 个答案:

答案 0 :(得分:1)

foreach($array as $item){
 $array_new[] = $item['date'];
 }

 foreach($object as $item){
  $array_new[] = $item->post->date;
 }

 sort($array_new);

答案 1 :(得分:1)

我将如何做到这一点:

// array we will use for sorting
$finalArray = array();
// add the array's using the date as the key
foreach($array as $item){
     $key = $item['date']; // use date here, example $key = date('l \t\h\e jS',$item['date']);
     $finalArray[$key] = $item;
}
// add the objects's using the date as the key
foreach($object as $item){
     $finalArray[$item->post->date] = $item;
}
//now sort by keys as Xeoncross noted
ksort($finalArray);
foreach($finalArray as $date=>$objOrArray){
     if(is_array($objOrArray)){
          //do your array printing here
     } else {
          //do your object printing here
     }
}

当然,我们可以使用get_object_vars将对象转换为数组,并使用最终数组上的任何排序函数,重要的部分是我们希望按日期排序,这就是我们需要它作为键的原因。

希望有所帮助。

答案 2 :(得分:0)

$dates = array();

foreach ($array as $item) {
  $dates[] = $item['date'];
}


foreach ($object as $item) {
    $dates[] = $item->post->date;
}

sort($dates);

foreach ($dates as $date) {
   echo $date;
}

答案 3 :(得分:0)

如果您需要来自对象的多个值(不仅仅是date)而且您不介意删除重复项,则可以尝试此操作。

// $array is already defined right?
$object = json_decode(json_encode($object), TRUE);
$data = array_merge($array, $object);

print_r($data); // now test it

http://us2.php.net/array_merge
http://us3.php.net/json_decode(请注意第二个TRUE参数)

修改

根据Perfection的回答,(并重新阅读问题)我会这样做:

$finalArray = array();
foreach($array as $item)
{
     $finalArray[$item['date']] = $item;
}

foreach($object as $item)
{
     $finalArray[$item->post->date] = json_decode(json_encode($item), TRUE);
}

ksort($finalArray);

foreach($finalArray as $date => $item)
{
    // Everything is an array now
}