2016-11-03 7 views
1

は私が持っているように、配列: - 私はグループに値の長さによって、この配列をしたいPHP配列を要素の長さでグループ化するにはどうすればいいですか?

array("a","b","ab","xy","abc","xyz","abcd","abcde"); 

。だからそれはのようにする必要があります: -

array(
    "1" => array("a","b"), //because there are two value which their lengths are = 1 
    "2" => array("ab","xy"), 
    "3" => array("abc","xyz"), 
    "4" => array("abcd"), 
    "5" => array("abcde") 
); 

私はインデックスで逆順にしたいです。

最終出力は、

array(
    "13" => array("13 length char"), 
    "12" => array("12 length char"), 
    ... 
    ... 
    "5" => array("abcde"), 
    "4" => array("abcd"), 
    "3" => array("abc","xyz"), 
    "2" => array("ab","xy"), 
    "1" => array("a","b") 
); 

私はkrsort()出力を使用した後

Array(
[10] => Array 
    (
     [0] => Abdülbari 
    ) 

[8] => Array 
    (
     [0] => ablefari 
    ) 

[7] => Array 
    (
     [0] => arakari 
    ) 

[3] => Array 
    (
     [0] => ari 
    ) 

[14] => Array 
    (
     [0] => ağari beğari 
    ) 

[20] => Array 
    (
     [0] => ağır erkeli muzari 
    ) 

[12] => Array 
    (
     [0] => Amerikanvari 
     [1] => amudufıkari 
    ) 

[5] => Array 
    (
     [0] => abari 
     [1] => abari 
     [2] => Acari 
     [3] => apari 
     [4] => atari 
    ) 

[6] => Array 
    (
     [0] => abbari 
     [1] => antari 
     [2] => asgari 
     [3] => asgari 
     [4] => aşari 
    ) 

) 

配列インデックスのような低屈折率に大きなインデックスから注文する必要があり

です:あなたは、以下のようにそれを行うことができます。.. 20,14,12

+1

'foreach'と' strlen'だけが必要です。あなた自身で何か試しましたか? –

+0

このコードとあなたが受け入れた答えは、UTF-8でエンコードされた文字列を適切に処理しないことに注意してください。既にあなたの出力には微妙なバグがあります。私は、このビットをどのように書くかについてのより良い例として、私の答えを見てみることをお勧めします。 – ChristianF

答えて

-1

を: -

<?php 

$array = array("a","b","ab","xy","abc","xyz","abcd","abcde"); 

$final_array = array(); 
foreach ($array as $arr){ 
    $final_array[strlen($arr)][] = $arr; //I have checked the length of values and make it the key so that automatically your each value will go to corresponding length array 
} 

echo "<pre/>";print_r($final_array); 

出力: - https://eval.in/671126

注: - 私は、値の長さをチェックし、自動的にそれぞれの値は、あなたが望むものを、対応する長さの配列

最終的な出力になりますように、それは重要な作るています - あなたがこれを行うことができhttps://eval.in/671137

+3

私は、説明がないコードだけを投稿することは良い選択ではないと思います。少なくとも、質問が学習の練習であると強く疑われるこのケースではありません。 – ChristianF

+0

投稿のみコードは_never_良い選択 – giorgio

+0

逆の注文状況のために私の質問を編集しました。私は 'asort()'を使用しましたが、正しく動作しません。私はPHPがインデックス値を文字列として扱うと思います。 () – hakiko

3

、非常に簡単に、mb_strlen()foreach()ループの組み合わせと、その長さをキーとして使用する一時的な配列です。

ここで私は宿題/テストプロジェクトと非常によく似たように、コードを書くつもりはありません。しかし、あなたは以下のリンクを見ている場合、彼らはあなたが始めるのに役立つはずです。

http://php.net/manual/en/function.mb-strlen.php
http://php.net/manual/en/control-structures.foreach.php

編集、追加:

のカップルがあったとして見てすでにコードを投稿している回答は、自分自身を投稿してもそれ以上の害はありません。

1

また、指定された値の長さをチェックしてグループに割り当てる関数を使用して配列を歩くだけでも可能です。

<?php 
    $arr = [ 'a','b','ab','xy','abc','xyz','abcd','abcde' ]; 
    $groups = []; 

    array_walk($arr, function(&$value, $key) use (&$groups) { 
     $groups[ mb_strlen($value) ][] = $value; 
    }); 
?> 

あなたが実行している例https://eval.in/671158

を見ることができるあなたは、少なくともPHP 5.3がuseキーワードで、スコープを継承できるようにする必要があります。

また、配列を逆にすることもありません。

$count = count($groups); 
for ($i = $count; $i >= 0; --$i) 
    print_r($groups[ $count - $i ]); 

また、順序通りに印刷しています。再び、PHP関数を悪用する必要はありません。なぜなら、より簡単に書けるように思えるからです。

+0

私はAnantの答えを下落させたのと同じ理由で、これをdownvoteしなければならないのではないかと心配しています。あなたのコードは技術的には優れていますが、彼の答えにはまだ同じ欠点があります。 UTF-8文字列を適切に処理できないことが含まれます。実際、あなたは、より凝縮された方法でより高度な方法を使用しているように見えるので、あなたは欲張りすることがさらに困難かもしれません。 – ChristianF

関連する問題