簡體   English   中英

PHP訂單數組對應於另一個數組值

[英]PHP order array acording to another array values

我有兩個數組,一個數組包含字符串元素,另一個數組恰好具有這些元素應該位於的位置。 在第二個數組中,鍵表示位置,而值表示第一個數組中的值應該位於的位置。 但是我無法使它工作。 這是我到目前為止的代碼:

<?php
$array1= array("d","c","b","e","a");
$poss  = array (3  ,2  ,1  ,4  ,0);
var_dump(orderArray($poss, $array1));

function orderArray($poss, $data){
    $countPoss = count($poss);
    $countData = count($data);
    if ($countPoss === $countData){
        for ($i=0; $i<$countData; $i++){
            if($poss[$i]!==$i){
                $aux = $data[$i];
                $data = insertArrayIndex($data, $aux, $poss[$i]);
                unset($data[$i]);
                $data = array_values($data);
            }
        }
    }else{
        return FALSE;
    }
    return $data;
}
function insertArrayIndex($array, $new_element, $index) {
     $start = array_slice($array, 0, $index); 
     $end = array_slice($array, $index);
     $start[] = $new_element;
     return array_merge($start, $end);
 }

換句話說, $array1應該根據$poss進行組織。 例如: $array1 '中的第一個元素應該位於結尾處的位置3,而'a'應該位於位置0處。我已經嘗試了數百種方法,但是我無法弄清楚。

你可以嘗試使用array_combine

// since keys are aligned with words you can combine into single array
$merged_array = array_combine($poss, $array1);
// then sort array by keys and your words are in correct position
ksort($merged_array);

// update $array1 with sorted values 
$array1 = array_values($merged_array);

如果您將此程序設計為練習,那么我希望您有耐心和好運!

但是,如果您在生產中需要此代碼,則最好使用PHP排序功能,而不要浪費時間。

解決方案1

使用array_combine()創建一個具有$poss作為鍵和$array1作為值的新數組,然后使用ksort()使用其鍵對該新數組進行排序:

$array1= array("d","c","b","e","a");
$poss  = array (3  ,2  ,1  ,4  ,0);

$out1 = array_combine($poss, $array1);
ksort($out1);
print_r($out1);

解決方案#2

使用函數array_multisort()可以同時對$poss $array1進行排序。 array_multisort()的第一個參數告訴順序,其他數組的值遵循第一個數組中值的移動:

$array1= array("d","c","b","e","a");
$poss  = array (3  ,2  ,1  ,4  ,0);

array_multisort($poss, $array1);
print_r($array1);

兩種方法的輸出:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
)

您需要做的就是合並數組,然后在保持索引關聯的同時對結果進行排序 :)

// given
$array1= array("d","c","b","e","a");
$poss  = array (3  ,2  ,1  ,4  ,0);

// combine
$indexedArray = array_combine($poss,$array1);

// sort
asort($indexedArray);

// test
print_r($indexedArray);

結果是:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
)

這樣就可以獲得正確索引的數組

$newarray = array();
foreach($poss as $key => $value)
  $newarray[$value] = $array1[$key];
var_dump($newarray);

以正確的索引和順序排列

$newarray = array();
for($i = 0; $i < count($poss); $i++) {
  $newarray[] = $array1[array_search($i, $poss)];
}
var_dump($newarray);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM