PHP - 如果数组包含某些值并且这些数组按特定顺序排序,则重新排序数组

时间:2014-10-10 13:03:14

标签: php arrays sorting

我有一个看起来像这样的数组......

Array
(
    [0] => Array
        (
            [region_id] => 1
            [region_content] => news2
        )

    [1] => Array
        (
            [region_id] => 2
            [region_content] => something_else
        )

    [2] => Array
        (
            [region_id] => 3
            [region_content] => news
        )

)

我需要用它做一些事情......

检查数组是否同时包含newsnews2,如果是,则在新闻之前出现news2时切换其位置。

因此得到的数组看起来像这样:

Array
(
    [0] => Array
        (
            [region_id] => 1
            [region_content] => news
        )

    [1] => Array
        (
            [region_id] => 2
            [region_content] => something_else
        )

    [2] => Array
        (
            [region_id] => 3
            [region_content] => news2
        )

)

所以我需要一些关于如何检查数组以及如何重新排序的帮助。

2 个答案:

答案 0 :(得分:0)

这应该按照您的要求进行:

// Check if both news and news2 exist and make sure news come before news2
function checkNewsAndSwap($array)
{
    // Obtain the indexes
    $indexes = [];
    foreach($array as $i => $v) {
        if($v['region_content'] == 'news') {
            $indexes[1] = $i;
        }
        elseif($v['region_content'] == 'news2') {
            $indexes[2] = $i;
        }
    }

    // Both news and news2 exist
    if(isset($indexes[1]) && isset($indexes[2])) {
        if($indexes[2] < $indexes[1]) {// If news comes after news2
            // Swap them!
            $tmp = $array[$indexes[1]]['region_content'];
            $array[$indexes[1]]['region_content'] = $array[$indexes[2]]['region_content'];
            $array[$indexes[2]]['region_content'] = $tmp;
        }
    }

    return $array;
}

测试代码和结果在这里:http://pastie.org/9637389

答案 1 :(得分:0)

这远不是一种有效的方法或最佳实践,但出于解释的目的:

<?php
$collection = [
    [
        'region_id' => 1,
        'region_content' => 'news2'
    ],
    [
        'region_id' => 2,
        'region_content' => 'something else'
    ],
    [
        'region_id' => 3,
        'region_content' => 'news'
    ],
];

$occurrences = 0;
$final = '';
foreach ($collection as $sub) {
    if (in_array($sub['region_content'], ['news', 'news2'])) {
        $occurrences++;
        $final = $sub['region_content'];
    }
}

$toSwitch = ($occurrences == 2) && $final == 'news';

if ($toSwitch) {
    foreach ($collection as &$sub) {
        if ($sub['region_content'] == 'news2') $sub['region_content'] = 'news';
        elseif ($sub['region_content'] == 'news') $sub['region_content'] = 'news2';
    }
}

var_dump($collection);

如果region_contentnewsnews2,我们正在递增出现次数变量。由于我们预计恰好有两次出现 - newsnews2,我们也会检查news2是否是第一次出现。因此,如果使用final填充了news个变量,我们确信news2之前的变量是。{/ p>

如果我们需要切换位置,那么如果Occurrences == 2且news2是第一个的最终结果是布尔表示。

此处切换位置与更改值无异。因为它是字符串我们只是硬编码它。如果它是一些嵌套集合,则可以在第一次迭代中提取其值。

The result of the dump is:

array (size=3)
  0 => 
    array (size=2)
      'region_id' => int 1
      'region_content' => string 'news' (length=4)
  1 => 
    array (size=2)
      'region_id' => int 2
      'region_content' => string 'something else' (length=14)
  2 => &
    array (size=2)
      'region_id' => int 3
      'region_content' => string 'news2' (length=5)