PHPでこのようなことは可能ですか?関数をどのように書きますか?以下に例を示します。順序が最も重要です。
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
そして、私は次のようなことをしたいです
$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));
最後にforeach()を使用し、それらが正しい順序ではないため(正しい順序である必要がある文字列に値を追加し、すべての配列キー/値)。
PHPの内部配列関数を調べましたが、アルファベット順または数値順にのみソートできるようです。
array_merge
またはarray_replace
を使用してください。 Array_merge
は、指定した配列から(適切な順序で)開始し、実際の配列からのデータでキーを上書き/追加することで機能します。
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
$properOrderedArray = array_merge(array_flip(array('name', 'dob', 'address')), $customer);
//Or:
$properOrderedArray = array_replace(array_flip(array('name', 'dob', 'address')), $customer);
//$properOrderedArray -> array('name' => 'Tim', 'address' => '123 fake st', 'dob' => '12/08/1986', 'dontSortMe' => 'this value doesnt need to be sorted')
ps-私はこの「古い」質問に答えています。なぜなら、以前の答えとして与えられたループはすべてやり過ぎだと思うからです。
そこに行きます:
function sortArrayByArray(array $array, array $orderArray) {
$ordered = array();
foreach ($orderArray as $key) {
if (array_key_exists($key, $array)) {
$ordered[$key] = $array[$key];
unset($array[$key]);
}
}
return $ordered + $array;
}
このソリューションはどうですか
$order = array(1,5,2,4,3,6);
$array = array(
1 => 'one',
2 => 'two',
3 => 'three',
4 => 'four',
5 => 'five',
6 => 'six'
);
uksort($array, function($key1, $key2) use ($order) {
return (array_search($key1, $order) > array_search($key2, $order));
});
PHP> = 5.3.0の別の方法:
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
$customerSorted = array_replace(array_flip(array('name', 'dob', 'address')), $customer);
結果:
Array (
[name] => Tim
[dob] => 12/08/1986
[address] => 123 fake st
[dontSortMe] => this value doesnt need to be sorted
)
文字列および数値キーで正常に動作します。
function sortArrayByArray(array $toSort, array $sortByValuesAsKeys)
{
$commonKeysInOrder = array_intersect_key(array_flip($sortByValuesAsKeys), $toSort);
$commonKeysWithValue = array_intersect_key($toSort, $commonKeysInOrder);
$sorted = array_merge($commonKeysInOrder, $commonKeysWithValue);
return $sorted;
}
1つの配列を注文として受け取ります。
$order = array('north', 'east', 'south', 'west');
array_intersect
を使用して、値に基づいて別の配列をソートできます Docs :
/* sort by value: */
$array = array('south', 'west', 'north');
$sorted = array_intersect($order, $array);
print_r($sorted);
または、キーでソートするには、 array_intersect_key
を使用します Docs :
/* sort by key: */
$array = array_flip($array);
$sorted = array_intersect_key(array_flip($order), $array);
print_r($sorted);
両方の関数は、最初のパラメーターの順序を保持し、2番目の配列から値(またはキー)のみを返します。
したがって、これら2つの標準的なケースでは、ソート/再配置を実行するために独自に関数を記述する必要はありません。
Darkwaltz4のソリューションを使用しましたが、array_fill_keys
の代わりにarray_flip
を使用して、$array
にキーが設定されていない場合にNULL
を入力しました。
$properOrderedArray = array_replace(array_fill_keys($keys, null), $array);
魔法がなければ...
$array=array(28=>c,4=>b,5=>a);
$seq=array(5,4,28);
SortByKeyList($array,$seq) result: array(5=>a,4=>b,28=>c);
function sortByKeyList($array,$seq){
$ret=array();
if(empty($array) || empty($seq)) return false;
foreach($seq as $key){$ret[$key]=$dataset[$key];}
return $ret;
}
この関数は、2番目のパラメーター$ keysに基づいてサブ配列とソート済み配列を返します
function array_sub_sort(array $values, array $keys){
$keys = array_flip($keys);
return array_merge(array_intersect_key($keys, $values), array_intersect_key($values, $keys));
}
例:
$array_complete = [
'a' => 1,
'c' => 3,
'd' => 4,
'e' => 5,
'b' => 2
];
$array_sub_sorted = array_sub_sort($array_complete, ['a', 'b', 'c']);//return ['a' => 1, 'b' => 2, 'c' => 3];
配列に配列がある場合は、Eranによる機能を少し調整する必要があります...
function sortArrayByArray($array,$orderArray) {
$ordered = array();
foreach($orderArray as $key => $value) {
if(array_key_exists($key,$array)) {
$ordered[$key] = $array[$key];
unset($array[$key]);
}
}
return $ordered + $array;
}
コード:
/**
* sort keys like in key list
* filter: remove keys are not listed in keyList
* ['c'=>'red', 'd'=>'2016-12-29'] = sortAndFilterKeys(['d'=>'2016-12-29', 'c'=>'red', 'a'=>3 ]], ['c', 'd', 'z']){
*
* @param array $inputArray
* @param string[]|int[] $keyList
* @param bool $removeUnknownKeys
* @return array
*/
static public function sortAndFilterKeys($inputArray, $keyList, $removeUnknownKeys=true){
$keysAsKeys = array_flip($keyList);
$result = array_replace($keysAsKeys, $inputArray); // result = sorted keys + values from input +
$result = array_intersect_key($result, $inputArray); // remove keys are not existing in inputArray
if( $removeUnknownKeys ){
$result = array_intersect_key($result, $keysAsKeys); // remove keys are not existing in keyList
}
return $result;
}
最初の提案
function sortArrayByArray($array,$orderArray) {
$ordered = array();
foreach($orderArray as $key) {
if(array_key_exists($key,$array)) {
$ordered[$key] = $array[$key];
unset($array[$key]);
}
}
return $ordered + $array;
}
第二の提案
$properOrderedArray = array_merge(array_flip(array('name', 'dob', 'address')), $customer);
私はこれらの提案の両方が素晴らしいことを指摘したかったです。しかし、それらはリンゴとオレンジです。違い? 1つは非連想フレンドリーで、もう1つは連想フレンドリーです。 2つの完全連想配列を使用している場合、配列merge/flipは実際に他の連想配列をマージして上書きします。私の場合、それは私が探していた結果ではありません。 settings.iniファイルを使用して、並べ替え順序の配列を作成しました。私がソートしていたデータ配列は、連想ソートの対応するもので上書きする必要がありませんでした。したがって、配列のマージはデータ配列を破壊します。どちらも優れた方法であり、開発者のツールボックスにアーカイブする必要があります。ニーズに基づいて、アーカイブで両方の概念が実際に必要になる場合があります。
@ Darkwaltz4からの回答を簡潔に採用し、反復ごとに異なるキーが配列に含まれる可能性がある状況にソリューションをどのように適合させたかを共有したいと思います。
Array[0] ...
['dob'] = '12/08/1986';
['some_key'] = 'some value';
Array[1] ...
['dob'] = '12/08/1986';
Array[2] ...
['dob'] = '12/08/1986';
['some_key'] = 'some other value';
次のような「マスターキー」を維持します。
$master_key = array( 'dob' => ' ' , 'some_key' => ' ' );
array_mergeは、$ master_keyに基づいてArray [1]反復でマージを実行し、その反復に対して['some_key'] = ''(空の値)を生成します。したがって、array_intersect_keyを使用して、次のように各反復で$ master_keyを変更しました。
foreach ($customer as $customer) {
$modified_key = array_intersect_key($master_key, $unordered_array);
$properOrderedArray = array_merge($modified_key, $customer);
}
PHPには、これを支援する機能があります。
$arrayToBeSorted = array('west', 'east', 'south', 'north');
$order = array('north', 'south', 'east', 'west');
// sort array
usort($arrayToBeSorted, function($a, $b) use ($order){
// sort using the numeric index of the second array
$valA = array_search($a, $order);
$valB = array_search($b, $order);
// move items that don't match to end
if ($valA === false)
return -1;
if ($valB === false)
return 0;
if ($valA > $valB)
return 1;
if ($valA < $valB)
return -1;
return 0;
});
Usortがすべての作業を行い、array_searchがキーを提供します。 array_search()は、一致する配列が見つからない場合にfalseを返すため、ソート配列にないアイテムは配列の一番下に自然に移動します。
注:uasort()は、キー=>値の関係に影響を与えずに配列を順序付けします。