PHP将数组排序为“喜欢”其他数组。怎么样?

时间:2014-08-27 19:11:23

标签: php

示例:

$a = [ 'b', 'd', 'a', 'e' ]
$b = [ 'e', 'a', 'q', 'b' ]

我想要

$b = [ 'b', 'a', 'e', 'q']

我需要对$b进行排序,以使$a中的每个元素按照$a中元素的相同顺序排列。

所以'b''a''e'位于$a,所以他们先来,然后新的'q'是最后的。

我问的是一个我不知道的函数,如果存在,或者是一种技术。

2 个答案:

答案 0 :(得分:2)

只要每个数组都有不同的值并且没有字符串键,这就应该有效。

$b = array_merge(array_intersect($a, $b), array_diff($b, $a));

这确实依赖于array_diff的无证件行为。

答案 1 :(得分:0)

如果您需要一段非常冗长,繁琐的代码,与 Don's panic 非常有创意的oneliner完全相同,您可以使用我的代码。 ; - )

这个的优点是它不依赖于array_diff等函数的(大多数未记录的)实现细节。此外,它给你一个很好的机会使用一个封闭,除了非常酷,没有特别的优势。代码可能会更短一点,但这个逐步解决方案至少应该相对容易理解。

<?php
$a = [ 'b', 'd', 'a', 'e', 'x' ];
$b = [ 'e', 'a', 'q', 'b', 'g' ];

// Custom sorter functions like usort use a callback that compares items.
// The compare function should return < 0 if the first item should come 
// before the second, > 0 if the second item should come first, or 0
// if both items can be considered equal.
$sortFunction = function($i1, $i2) use ($a, $b)
{
  // Get the indexes of both item in array $a 
  $x1 = array_search($i1, $a);
  $x2 = array_search($i2, $a);
  // If both indexes are assigned, compare them.
  if ($x1 !== false && $x2 !== false)
    return $x1 - $x2;
  // Only the first item exists, so that one is 'smaller' (should come before the other)
  if ($x1 !== false)
    return -1;
  // Only the second item exists, so that one is 'smaller'
  if ($x2 !== false)
    return 1;
  // Neither exist. Keep the original order as they were in $b.
  return array_search($i1, $b) - array_search($i2, $b);
};

$c = $b;
usort($c, $sortFunction);