【问题标题】:Skip repeating array and reverse order of the array跳过重复数组和数组的逆序
【发布时间】:2015-08-08 10:02:05
【问题描述】:

我有这个数组。在此我想跳过反向数据的值。

$data = array(
    array(2, 1),
    array(1, 2),
    array(1, 2),
    array(2, 1),
    array(2, 3),
    array(3, 2),
    array(4, 5)
);

我想跳过这些值:

array(1,2)
array(1,2)
array(2,1)
array(3,2)

我希望结果数组是这样的:

array(
    array(2, 1),
    array(2, 3),
    array(4, 5)
);

【问题讨论】:

  • 你的意思是要消除重复值,然后对数组进行排序?或者你的意思是简单地从数组中删除单个值?你能解释一下你所说的“跳过”是什么意思吗?哪些规则决定了哪些元素要被跳过?
  • 是的,我想消除重复值以及消除数组的倒序。
  • 他想删除重复的子数组,即使子数组中的元素顺序不同。基本上是唯一的子数组 - 键不重要。

标签: php arrays multidimensional-array array-reverse


【解决方案1】:
$data = [[2,1], [1,2], [1,2], [2,1], [2,3], [3,2], [4,5]];

$data = array_map(
    function($value) {
        sort($value);
        return serialize($value);
    },
    $data
);

$data = array_unique($data);
$data = array_map('unserialize', $data);
array_walk($data, 'sort');

var_dump($data);

Demo

编辑

根据 arbogast 的评论,这可以进一步简化,消除序列化/反序列化步骤:

$data = [[2,1], [1,2], [1,2], [2,1], [2,3], [3,2], [4,5]];

array_walk($data, 'sort');
$data = array_unique($data, SORT_REGULAR);

var_dump($data);

Demo

【讨论】:

  • 这确实对子数组进行了排序,但不是 100%。
  • 如果您不想对子数组进行排序,您可以随时跳过最后一行 array_walk($data, 'sort');
  • 如果你使用 array_unique($data, SORT_REGULAR); 你可以得到相同的结果那么你就不必使用序列化了。
  • @arbogast - 感谢您的提示,我不知道 array_unique().. 的标志对了解很有用
  • @Mark Ba​​ker 很高兴我能帮上忙。
【解决方案2】:

试试这个:

function filterArray($data)
{
      $result = array();
      array_push($result, $data[0]); //You can always add first item without performing any check
      for($i=1; $i<count($data); $i++)
      {
          $allowAdd = true;
          foreach($result as $res)
          {
              if(($res == $data[$i]) || ($res[0] = $data[$i][1] && $res[1] = $data[$i][0]))
              {
                  $allowAdd = false;
                  break;
              }
          }
          if($allowAdd)
            array_push($result, $data[$i]);
     }
     return $result;
}

现在,当您调用 filterArray($data) 时,这将返回过滤后的结果。

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 2016-09-20
    • 2022-01-18
    相关资源
    最近更新 更多