php 按另一个数组的排序顺序对数组进行排序

问题描述 投票:0回答:2

我有两个多维数组,需要根据不同的键以与第二个数组相同的顺序对第一个数组进行排序(但它们的值相同)。在下面的示例中,我需要将

$allOptions
排序为与
$regOptions
相同的顺序,但基于
clID == optID
的值。

但是,并非所有

$allOptions
子数组 (clID) 都存在于
$regOptions
子数组 (optID) 中......因此
$allOptions
中的任何不匹配元素都将被扔到底部/末尾数组。

我该怎么做?

$allOptions = array(
     array("clID"=> 171, ...other values),
     array("clID"=> 191, ...other values),
     array("clID"=> 131, ...other values),
     array("clID"=> 101, ...other values),
     array("clID"=> 201, ...other values),
     array("clID"=> 181, ...other values),
     ...
     array("clID"=> 99, ...other values),  // not in regOptions
     array("clID"=> 129, ...other values)  // not in regOptions
     array("clID"=> 139, ...other values)
    
) ;

$regOptions = array(
    array("order"=>1,"optID"=> 131, ...other values),
    array("order"=>2,"optID"=> 191, ...other values),
    array("order"=>3,"optID"=> 181, ...other values),
    array("order"=>4,"optID"=> 139, ...other values),
    array("order"=>5,"optID"=> 101, ...other values),
    array("order"=>6,"optID"=> 201, ...other values),
    array("order"=>7,"optID"=> 171, ...other values) 
    ...
) ;

所以输出将是:

$allOptions = array(
     array("clID"=> 131, ...other values),
     array("clID"=> 191, ...other values),
     array("clID"=> 181, ...other values),
     array("clID"=> 139, ...other values)
     array("clID"=> 101, ...other values),
     array("clID"=> 201, ...other values),
     array("clID"=> 171, ...other values),
     ...
     array("clID"=> 99, ...other values),  // not in regOptions
     array("clID"=> 129, ...other values)  // not in regOptions
) ;
php sorting multidimensional-array
2个回答
1
投票

使用 php usort()

示例

function customSort($a, $b, $regOptions) {
  $aOptID = $a['clID'];
  $bOptID = $b['clID'];
  $aOrder = array_search($aOptID, array_column($regOptions, 'optID'));
  $bOrder = array_search($bOptID, array_column($regOptions, 'optID'));
  return $aOrder - $bOrder;
}

usort($allOptions, function($a, $b) use ($regOptions) {
  return customSort($a, $b, $regOptions);
});

0
投票

这是一个不基于

array_search()
的解决方案:

$allOptions = [["clID" => 1], ["clID" => 2], ["clID" => 3], ["clID" => 4]];
$regOptions = [["optID" => 3], ["optID" => 2]];

$order = [];
foreach($regOptions as $key => $option)
    $order[$option['optID']] = $key;

usort($allOptions, function($o1, $o2) use($order)
{
    $id1 = $o1['clID'];
    $id2 = $o2['clID'];
    if(isset($order[$id1]) && isset($order[$id2]))
        return $order[$id1] <=> $order[$id2];
    if(isset($order[$id1]) && !isset($order[$id2]))
        return -1;
    if(!isset($order[$id1]) && isset($order[$id2]))
        return 1;
    return $id1 <=> $id2;
});

var_export($allOptions);

结果:

array (
  0 => 
  array (
    'clID' => 3,
  ),
  1 => 
  array (
    'clID' => 2,
  ),
  2 => 
  array (
    'clID' => 1,
  ),
  3 => 
  array (
    'clID' => 4,
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.