基于另一个数组并保存键[重复]

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

我已经在堆栈溢出中找到了这个问题,但可悲的是,它在JavaScript中 - 基于另一个数组的JavaScript数组 我想要它在php

$data = array( "item1"=>"1", "item2"=>"3", "item3"=>"5", "item4"=>"2", "item5"=>"4" );

匹配此数组的布置:
sortingArr = array("5","4","3","2","1");

和我正在寻找的输出:
$data = array(
    "item3"=>"5",
    "item5"=>"4",
    "item2"=>"3",
    "item4"=>"2",
    "item1"=>"1"
 );

对于详细的答案,为什么Array_multisort不符合您的需求,请查看此答案,请: 
php arrays sorting custom-sort
7个回答
13
投票

使用usort

array_flip

,因此您可以将您的

索引阵列(valuebyposition)转换为一个positionbyvalue

阵列。

    $data = array(
   "item1"=>"1",
   "item2"=>"3",
   "item3"=>"5",
   "item4"=>"2",
   "item5"=>"4"
);

usort($data, "sortByPredefinedOrder");

function sortByPredefinedOrder($leftItem, $rightItem){
  $order = array("5","4","3","2","1");

  $flipped = array_flip($order);

  $leftPos = $flipped[$leftItem];
  $rightPos = $flipped[$rightItem];
  return $leftPos >= $rightPos;   
}

print_r($data);
// usort: Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1 )
// uasort: Array ( [item3] => 5 [item5] => 4 [item2] => 3 [item4] => 2 [item1] => 1 )
comply这需要您预测预定义订单数组中的所有可能项目,或以适当的方式将其他项目进行线索。
如果您想维护关联键,请使用
uasort而不是usort

简单?

$data = array( "item1"=>"1", "item2"=>"3", "item3"=>"5", "item4"=>"2", "item5"=>"4" ); $sortingArr = array("5","4","3","2","1"); $result = array(); // result array foreach($sortingArr as $val){ // loop $result[array_search($val, $data)] = $val; // adding values } print_r($result); // print results

输出:
Array
(
    [item3] => 5
    [item5] => 4
    [item2] => 3
    [item4] => 2
    [item1] => 1
)


10
投票

使用

usort()

the right way

我认为

2
投票
使用用户定义的比较函数划分数阵列。

您可以做以下操作:

$data = array(
   "item1"=>"1",
   "item2"=>"3",
   "item3"=>"5",
   "item4"=>"2",
   "item5"=>"4"
);

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

$keys = array_flip($sortingArr);

usort($data, function ($a, $b) use ($keys) {
    return $keys[$a] > $keys[$b] ? 1 : -1;
});

print_r($data);

// Output
// Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1 )
live示例:Https://3v4l.org/75cnu

    

我为我的解决方案感到非常自豪:

uasort($data, function($a, $b) use ($sortingArr) { return array_search($a, $sortingArr) <=> array_search($b, $sortingArr); });

工作示例:

https://3v4l.org/bbik2

IT按要求使用uasort

来维护密钥值关联。 (与 @Hassan原本优雅的解决方案不同)

2
投票
它不需要$数据数组中的每个元素都存在于排序阵列中。 (例如 @hamza的解决方案)

the的简短

使用太空飞船操作员
<=>
进行比较而不是更多的详细逻辑。

代码:

  1. 看我的以下片段,以根据另一个数组对数组进行排序:
    $res_arr = array(); 
    for ($i = 0; $i < count($sortingArr); $i++) {
         for ($j = 0; $j < count($data); $j++) {
              if($data[$j] == $sortingArr[$i]) {
                 $res_arr[] = $data[$j];
                 break;
              }
         }
    }
    // $res_array is your sorted array now
    
  2. 将代码片段以输入顺序排序进行代码段
  3. $input_format_list = [4, 1]; $data = array( "0" => array( "School" => array( "id" => 1, "name" => "ST.ANN'S HIGH SCHOOL", ) ), "1" => array( "School" => array( "id" => 4, "name" => "JYOTI VIDHYA VIHAR", ) ) ); $result = array(); // result array foreach($input_format_list as $key => $value){ // loop foreach ($data as $k => $val) { if ($data[$k]['School']['id'] === $value) { $result[$key] = $data[$k]; } } } return $result;
  4. 
    
  5. 查看

array_multisort


1
投票
usort

清楚地定义我的条款),但它可能对您有用。

<?php 
$data = array(
   "item1"=>"1",
   "item2"=>"3",
   "item3"=>"5",
   "item4"=>"2",
   "item5"=>"4"
);
$result=array_flip($data);

krsort($result);

$result=array_flip($result);

print_r($result);

//use rsort for the index array

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

print_r($sortingArr);

1
投票

在安德鲁的答案上扩展,如果您希望排序阵列中的未定义条目出现在输出数组的末尾:

uasort($currentTags, function ($a, $b) use ($sortingArr) { if (in_array($a, $sortingArr) && !in_array($b, $sortingArr)) return -1; if (!in_array($a, $sortingArr) && in_array($b, $sortingArr)) return 1; if (!in_array($b, $sortingArr)) return -1; return array_search($a, $sortingArr) <=> array_search($b, $sortingArr); });
    

0
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.