<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>twitter のアカウントは sarabandejp と masakielastic (仕事関係)です。</description><title>Sarabande.jp</title><generator>Tumblr (3.0; @sarabandejp)</generator><link>http://blog.sarabande.jp/</link><item><title>insert、insertWith、insertWithKey、insertLookupWithKey (Data.Map)</title><description>&lt;p&gt;
データの挿入について。insertWith の第1引数である関数は既存の値と新しい値の2つの引数をとり、insertWithKey および insertLookupWithKey の関数はキー、新しい値、古い値の3つの引数をとる。insertWithKey と insertLookupWithKey の共通点は前者の戻り値と後者の戻り値のタプルの2番目の要素は連想リストであることで違いは後者の戻り値のタプルの1番目の要素が Maybe 型であること。
&lt;/p&gt;

&lt;pre class="prettyprint haskell"&gt;
&amp;gt; let a = fromList [(1,3),(2,5)]
&amp;gt; insert 2 7 a
fromList [(1,3),(2,7)]
&amp;gt; insert 3 7 a
fromList [(1,3),(2,5),(3,7)]
&amp;gt; insertWith (+) 2 7 a
fromList [(1,3),(2,12)]
&amp;gt; insertWith (+) 3 7 a
fromList [(1,3),(2,5),(3,7)]
&amp;gt; let f key new_value old_value = key + new_value + old_value
&amp;gt; insertWithKey f 3 7 afromList [(1,3),(2,5),(3,7)]
&amp;gt; insertWithKey f 2 7 a
fromList [(1,3),(2,14)]
&amp;gt; insertLookupWithKey f 2 7 a
(Just 5,fromList [(1,3),(2,14)])
&amp;gt; insertLookupWithKey f 3 7 a
(Nothing,fromList [(1,3),(2,5),(3,7)])
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24253981245</link><guid>http://blog.sarabande.jp/post/24253981245</guid><pubDate>Sat, 02 Jun 2012 19:43:19 +0900</pubDate><category>haskell</category></item><item><title>null、member、notMember、lookup、findWithDefault</title><description>&lt;p&gt;
member、notMember、lookup、findWithDefault はすべて要素の検索を行うことが共通で戻り値は member、notMember が Bool 型、lookup は Maybe 型、findWithDefault は指定した値が存在しなければ第1引数の値を返す。
&lt;/p&gt;

&lt;pre class="prettyprint haskell"&gt;
&amp;gt; Data.Map.null(empty)
True
&amp;gt; Data.Map.null(singleton 1 'a')
False
&amp;gt; let a = fromList [(3,'a'),(5, 'b')]
&amp;gt; member 3 a
True
&amp;gt; member 7 a
False
&amp;gt; notMember 3 a
False
&amp;gt; notMember 7 a
True
&amp;gt; Data.Map.lookup 3 a
Just 'a'
&amp;gt; Data.Map.lookup 7 a
Nothing
&amp;gt; findWithDefault 'c' 3 a
'a'
&amp;gt; findWithDefault 'c' 7 a
'c'
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24251133294</link><guid>http://blog.sarabande.jp/post/24251133294</guid><pubDate>Sat, 02 Jun 2012 17:34:29 +0900</pubDate><category>haskell</category></item><item><title>empty、singleton (Data.Map)</title><description>&lt;p&gt;
Data.List はだいぶやりつくしたので、Data.Map の写経に写る。 
&lt;/p&gt;

&lt;pre class="prettyprint haskell"&gt;
&amp;gt; size empty
0
&amp;gt; empty
fromList []
&amp;gt; size empty
0
&amp;gt; singleton 1 'a'
fromList [(1,'a')]
&amp;gt; size $ singleton 1 'a'
1
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24250126871</link><guid>http://blog.sarabande.jp/post/24250126871</guid><pubDate>Sat, 02 Jun 2012 16:52:32 +0900</pubDate><category>haskell</category></item><item><title>array_map のコールバック関数がキーを受け付けるようにする</title><description>&lt;p&gt;
少し前に array_map のキー対応の記事を書いたが、コールバック関数を受け付けられるようにしていなかったことに気づいたので、新しく記事を書くことにした。array_map は複数の配列を引数にとれるような仕様になっているが、この機能は使う機会はほとんどないので、受け取る配列は1つにした。そうするとコールバックと配列の順番を array_filter と合わせてもよいかもしれないが、既存の array_map との整合性を優先した。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function array_map_with_key(callable $callback, array $array) {
    $ret = [];
    foreach ($array as $key =&amp;gt; $value) {
        $ret[] = $callback($key, $value);
    }
    return $ret;
}

function array_map_with_key2(callable $callback, array $array) {
    return array_map(
        function($key, $value) use($callback) {
            return $callback($key, $value);
        },
        array_keys($array),
        $array
    );
}

$array = range(0, 10, 2);
$callback = function($key, $value) {
    return pow($key, 2) + 1;
};

var_dump(
    array_map_with_key($callback, $array),
    array_map_with_key2($callback, $array)
);
&lt;/pre&gt;

&lt;blockquote&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.sarabande.jp/post/24057549318"&gt;キーとバリューの両方の処理を array_map で行う&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;</description><link>http://blog.sarabande.jp/post/24249930793</link><guid>http://blog.sarabande.jp/post/24249930793</guid><pubDate>Sat, 02 Jun 2012 16:44:45 +0900</pubDate><category>php</category></item><item><title>array_fill にコールバック関数を受け付ける機能を追加する</title><description>&lt;p&gt;
コールバック関数はキーを引数にとれるようにした。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function array_fill_callback($start_index, $num, callable $callback) {
    $ret = array_fill($start_index, $num, '');
    foreach ($ret as $key =&amp;gt; &amp;amp;$value) {
        $value = $callback($key);
    }
    return $ret;
}

$callback = function($key) { return pow($key, 2) + 1; } ;

var_dump(array_fill_callback(8, 3, $callback));
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24248983084</link><guid>http://blog.sarabande.jp/post/24248983084</guid><pubDate>Sat, 02 Jun 2012 16:09:00 +0900</pubDate><category>php</category></item><item><title>range にスタートインデックス指定を追加する</title><description>&lt;p&gt;
array_fill と range 関数を見比べると、range 関数のスタートインデックスを 0 だけでなく任意の値に指定できないかと思ったので書いてみた。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function range2($start_index, $start, $limit, $step = 1) {
    $count = floor(($limit - $start) / $step);
    $keys = range($start_index, $start_index + $count);
    return array_combine($keys, range($start, $limit, $step));
}

var_dump(range2(5, 8, 30, 3));
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24247894298</link><guid>http://blog.sarabande.jp/post/24247894298</guid><pubDate>Sat, 02 Jun 2012 15:34:10 +0900</pubDate><category>php</category></item><item><title>range の定義</title><description>&lt;p&gt;
数値だけを考える。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function range2($start, $limit, $step = 1) {
    $count = floor(($limit - $start) / $step);
    $ret = [];

    for ($i = 0; $i &amp;lt;= $count; ++$i) {
        $ret[$i] = $start + $step * $i;
    }
    return $ret;
}

var_dump(range2(8, 30, 3));
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24247445952</link><guid>http://blog.sarabande.jp/post/24247445952</guid><pubDate>Sat, 02 Jun 2012 15:21:00 +0900</pubDate><category>php</category></item><item><title>array_fill を for、foreach、array_map、array_reduce でユーザー定義する</title><description>&lt;p&gt;array_map をユーザー定義する状況と似ている。foreach、array_map の場合、初期値の生成に array_flip と range 関数を使った。

&lt;pre class="prettyprint php"&gt;
function array_fill2($start_index, $num, $value) {
    $ret = [];

    for ($i=$start_index; $i &amp;lt; $start_index + $num; ++$i) {
        $ret[$i] = $value;
    }

    return $ret;
}

function array_fill3($start_index, $num, $value) {
    $ret = array_flip(range($start_index, $start_index + $num - 1));
    
    foreach ($ret as &amp;amp;$r) {
        $r = $value;
    }

    return $ret;
}

function array_fill4($start_index, $num, $value) {
    return array_map(
        function() use($value) { return $value; }, 
        array_flip(range($start_index, $start_index + $num - 1))
    );
}

function array_fill5($start_index, $num, $value) {
    return array_reduce(
        array_flip(range($start_index, $start_index + $num - 1)),
        function($result, $item) use($value) { 
            $result[] = $value; return $result;
        }, 
    '');
}

var_dump(
    array_fill2(8, 10, 9),
    array_fill3(8, 10, 9),
    array_fill4(8, 10, 9),
    array_fill5(8, 10, 9)
);
&lt;/pre&gt;&lt;/p&gt;</description><link>http://blog.sarabande.jp/post/24231851064</link><guid>http://blog.sarabande.jp/post/24231851064</guid><pubDate>Sat, 02 Jun 2012 10:38:00 +0900</pubDate><category>php</category></item><item><title>null はスカラーではない</title><description>&lt;p&gt;
is_scalar のコメントで見つけた情報。empty 関数で空と見なされる値に is_scalar を適用すると結果は次のようになった。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
var_dump(
    array_map(
        function($value) { return is_scalar($value);}, 
        ['',  // true 
         0,  // true
         0.0, // true
         '0', // true
         null, // false
         false, // true
         [] // false
         ]
));
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24189902753</link><guid>http://blog.sarabande.jp/post/24189902753</guid><pubDate>Fri, 01 Jun 2012 20:23:33 +0900</pubDate><category>php</category></item><item><title>array_uintersect_assoc でバリューをフィルタリングする</title><description>&lt;p&gt;array_filter の代わりに array_uinterect_assoc を使ってバリューをフィルタリングすることができる。array_uintersect も試してみたが、こちらはうまくゆかなかった。

&lt;pre class="prettyprint php"&gt;
function array_filter2(array $array, callable $callback) {
    return array_uintersect_assoc($array, $array,
        function($value1, $value2) use($callback) { 
            return $callback($value1) ? 0 : 1;
        });
}

$array = [0 =&amp;gt; 2, 1 =&amp;gt; 5, 2 =&amp;gt; 15, 3 =&amp;gt; 22, 4 =&amp;gt; 34];
$callback = function($value) {
    return (0 === $value % 2) ? true : false;
};

var_dump(
    array_filter($array, $callback),
    array_filter2($array, $callback)
);
&lt;/pre&gt;&lt;/p&gt;</description><link>http://blog.sarabande.jp/post/24189830395</link><guid>http://blog.sarabande.jp/post/24189830395</guid><pubDate>Fri, 01 Jun 2012 20:20:00 +0900</pubDate><category>php</category></item><item><title>コールバック関数でキーをフィルタリングする</title><description>&lt;p&gt;Haskell の Data.Map に filterWithKey 関数が定義されていたので、PHP 版がほしくなったので。&lt;/p&gt;

&lt;p&gt;まずは素直に foreach 文を使った定義。&lt;/p&gt;
&lt;pre class="prettyprint php"&gt;
function array_filter_with_key(array $array, callable $callback) {
    $ret = [];

    foreach($array as $key =&amp;gt; $value) {
        if ($callback($key)) {
            $ret[$key] = $value;
        }
    }
    return $ret;
}

$array = [0 =&amp;gt; 2, 1 =&amp;gt; 5, 2 =&amp;gt; 15, 3 =&amp;gt; 22, 4 =&amp;gt; 34];
$callback = function($key) { return 0 === $key % 2;};

var_dump(
    array_filter_with_key(
        $array,
        $callback)
);
&lt;/pre&gt;

&lt;p&gt;
次に array_filter を使った定義。戻り値のために変数を用意しなくてすむ。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function array_filter_with_key2(array $array, callable $callback) {
    return array_intersect_key(
        $array, 
        array_flip(array_filter(array_keys($array), $callback)));
}
&lt;/pre&gt;

&lt;p&gt;
array_keys、array_filter、array_flip、array_intersect_key と4つの関数を使うなんて、パフォーマンスに問題があるのではないかと思ったあなた。1つの関数、array_intersect_key の仲間の array_intersect_ukey を使えばすみます。この関数は2つの配列を比較する関数なのですが、両方に同じ配列を指定し、array_filter 関数の引数として渡す述語関数の仕様を満たすために、array_intersect_ukey が受け取るコールバック関数は述語関数を受け取るように定義します。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function array_filter_with_key3(array $array, callable $callback) {
    return array_intersect_ukey($array, $array,
        function($key1, $key2) use($callback) { 
            return $callback($key1) ? 0 : 1;
        }
    );
}
&lt;/pre&gt;

&lt;p&gt;
array_intersect_ukey の代わりに array_intersect_uassoc を使うこともできますが、違いがわからない。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function array_filter_with_key4(array $array, callable $callback) {
    return array_intersect_uassoc($array, $array,
        function($key1, $key2) use($callback) { 
            return $callback($key1) ? 0 : 1;
        }
    );
}
&lt;/pre&gt;

&lt;blockquote&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/4260086/php-how-to-use-array-filter-to-filter-array-keys"&gt;PHP: How to use array_filter() to filter array keys?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;</description><link>http://blog.sarabande.jp/post/24178664526</link><guid>http://blog.sarabande.jp/post/24178664526</guid><pubDate>Fri, 01 Jun 2012 13:35:00 +0900</pubDate><category>php</category></item><item><title>キーとバリューの両方の処理を array_map で行う</title><description>&lt;p&gt;
foreach 文では foreach ($array as $key =&amp;gt; $value) のようにキーとバリューの両方の組み合わせの処理をこなすことができるが、array_map の場合は array_values 関数からキーの配列を別に用意する必要がある。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function array_map2(array $array) {
    $ret = [];
    foreach ($array as $key =&amp;gt; $value) {
        $ret[] = $key + $value;
    }
    return $ret;
}

function array_map3(array $array) {
    return array_map(
        function($key, $value) {
            return $key + $value;
        },
        array_keys($array),
        $array
    );
}

$array = [1 =&amp;gt; 9, 2 =&amp;gt; 8, 3 =&amp;gt; 7];

var_dump(
    array_map2($array),
    array_map3($array)
);
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24057549318</link><guid>http://blog.sarabande.jp/post/24057549318</guid><pubDate>Wed, 30 May 2012 20:01:00 +0900</pubDate><category>php</category></item><item><title>for 文によるインデックスに応じた処理を array_map に書き換える</title><description>&lt;p&gt;
マルチバイトの文字列を配列に変換する処理を書いていてコードは次のように変わっていった。
&lt;/p&gt;

&lt;p&gt;
当初は for 文を使ったごくふつうの処理。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function str_to_array($string, $encoding = 'UTF-8') {
    $length = mb_strlen($string, $encoding);
    $array = [];

    for ($i = 0; $i &amp;lt; $length; ++$i) {
        $array[] = mb_substr($string, $i, 1, $encoding);
    }

    return $array;
}
&lt;/pre&gt;

&lt;p&gt;
次に foreach 文に書き換えた。配列の初期化が range 関数に置き換わった。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function str_to_array($string, $encoding = 'UTF-8') {
    $length = mb_strlen($string, $encoding);

    foreach (range(0, $length - 1) as $key =&amp;gt; $value) {
        $array[$key] = mb_substr($string, $key, 1, $encoding);
    }

    return $array;
}
&lt;/pre&gt;

&lt;p&gt;
range 関数を初期値の代わりに使うのであれば、配列の要素の値をインデックスとして使えることに気がついたので、array_map にたどり着くことができた。戻り値を計算するために変数 $array を用意する必要がなくなった。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function str_to_array($string, $encoding = 'UTF-8') {
    $length = mb_strlen($string, $encoding);
    return array_map(
        function($index) use($string, $encoding) { 
            return mb_substr($string, $index, 1, $encoding);
        },
        range(0, $length - 1)
    );
    
}
&lt;/pre&gt;

&lt;p&gt;
mb_strlen 関数は一回しか使われていないので、range 関数の変数で直接指定すると、途中計算のために変数がすべてなくなった。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function str_to_array($string, $encoding = 'UTF-8') {
    return array_map(
        function($index) use($string, $encoding) { 
            return mb_substr($string, $index, 1, $encoding);
        },
        range(0, mb_strlen($string, $encoding); - 1)
    );
    
}
&lt;/pre&gt;

&lt;p&gt;
もう1つの例。Haskell の cycle　関数を PHP で模したもの。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function cycle(array $array, $repeat) {
    $length = count($array);
    $ret = [];
    
    for ($i = 0; $i &amp;lt; $repeat; ++$i) {
        $ret[] = $array[$i % $length];
    }

    return $ret;
}
&lt;/pre&gt;

&lt;p&gt;
for 文の場合、戻り値のために変数を用意し、初期化しなければならないが、次のように初期化を range 関数に使いロジックを array_map に移すことで、戻り値のための変数を用意しなくてすむ。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function array_repeat(array $array, $multiplier) {
    $length = count($array);
    return array_map(
             function($index) use($array, $length) {
                 return $array[$index % $length];
             },
             range(0, $multiplier - 1)
             );
}
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24055044615</link><guid>http://blog.sarabande.jp/post/24055044615</guid><pubDate>Wed, 30 May 2012 18:04:00 +0900</pubDate><category>php</category><category>リファクタリング</category></item><item><title>ランダムな初期値を配列形式で用意する</title><description>&lt;p&gt;
array_fill を使えば同じ値の初期値を配列形式を用意できますが、では各要素がランダムな初期値を配列形式で用意するにはどうしたらよいのでしょうかという質問に対する回答は次のようになる。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function init_values(array $array, $length) {
    $array = array_flip($array);
    $ret = array_fill(0, $length - 1, '');
    return array_map(function() use($array) {return array_rand($array); }, $ret); 
}

$init = range('a', 'z');
var_dump(init_values($init, 10));
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24049131489</link><guid>http://blog.sarabande.jp/post/24049131489</guid><pubDate>Wed, 30 May 2012 14:27:48 +0900</pubDate><category>php</category></item><item><title>乱数を要素とする配列を生成する</title><description>&lt;p&gt;
連続する数値を要素とする配列は range で生成できるように、非連続な数値、たとえば乱数を要素とする配列を生成できる標準関数はないかと探したが見つからなかったので。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function array_random_numbers($length, $min = '', $max = '') {
    $callback = function() use($min, $max) {
        if (is_int($min) &amp;amp;&amp;amp; is_int($max)) {
            return mt_rand($min, $max);
        } else {
            return mt_rand();
        }
    };
    $array = array_fill(0, $length - 1, '');
    return array_map($callback, $array);
}

var_dump(array_random_numbers(10));
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24047603489</link><guid>http://blog.sarabande.jp/post/24047603489</guid><pubDate>Wed, 30 May 2012 13:51:02 +0900</pubDate><category>php</category></item><item><title>str_shuffle　のマルチバイト対応版</title><description>&lt;p&gt;mb_str_shuffle で検索するとpreg_split を使ったユニコード版は見つかったが、マルチバイト版は見つからなかったので。

&lt;pre class="prettyprint php"&gt;
&amp;lt;?php

function str_to_array($string, $encoding = 'UTF-8') {
    return array_map(
        function($index) use($string, $encoding) { 
            return mb_substr($string, $index, 1, $encoding);
        },
        range(0, mb_strlen($string, $encoding) - 1)
    );
}

function mb_str_shuffle($string, $encoding = 'UTF-8') {
    $array = str_to_array($string);
    shuffle($array);
    return implode('', $array);
}

$string = 'あいうえおかきくけこ';
echo mb_str_shuffle($string),PHP_EOL;
&lt;/pre&gt;&lt;/p&gt;</description><link>http://blog.sarabande.jp/post/24045928041</link><guid>http://blog.sarabande.jp/post/24045928041</guid><pubDate>Wed, 30 May 2012 13:16:00 +0900</pubDate><category>php</category></item><item><title>リストで先入先出、先入後出、後入先出、後入後出 (Haskell)</title><description>&lt;p&gt;やってみるとあっけないが、頭の体操に。&lt;/p&gt;

&lt;p&gt;先入先出&lt;/p&gt;

&lt;pre class="prettyprint haskell"&gt;
&amp;gt; let a = [1,2,3,4]
&amp;gt; [0] ++ a
&amp;gt; head $ [0] ++ a
&lt;/pre&gt;

&lt;p&gt;先入後出&lt;/p&gt;
&lt;pre class="prettyprint haskell"&gt;
&amp;gt; [0] ++ a
&amp;gt; last $ [0] ++ a
&lt;/pre&gt;

&lt;p&gt;後入先出&lt;/p&gt;
&lt;pre class="prettyprint haskell"&gt;
&amp;gt; a ++ [5]
&amp;gt; head $ a ++ [5]
&lt;/pre&gt;

&lt;p&gt;後入後出&lt;/p&gt;
&lt;pre class="prettyprint haskell"&gt;
&amp;gt; a ++ [5]
&amp;gt; last $ a ++ [5]
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24045143262</link><guid>http://blog.sarabande.jp/post/24045143262</guid><pubDate>Wed, 30 May 2012 13:01:14 +0900</pubDate><category>haskell</category></item><item><title>マルチバイト文字からランダムな文字列を生成する</title><description>&lt;p&gt;もとになるマルチバイト文字列は配列形式で渡す。ランダムなマルチバイト文字列は同じ文字を複数回使うことを認めるか認めないかでそれぞれ別の関数を用意した。&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
function array_to_random_string(array $array, $length) {
    $array = array_flip($array);
    return array_reduce(
        range(0, $length - 1), 
        function($result, $value) use($array) {
            return array_rand($array) . $result;
        }, 
        '');
}

function array_to_random_string2(array $array, $length) {
    shuffle($array);
    $array = array_slice($array, 0, $length);
    return implode('', $array);
}


function str_to_array($string, $encoding = 'UTF-8') {
    return array_map(
        function($index) use($string, $encoding) { 
            return mb_substr($string, $index, 1, $encoding);
        },
        range(0, mb_strlen($string, $encoding) - 1)
    );
}

function string_to_random_string($string, $length, $encoding = 'UTF-8') {
    $array = str_to_array($string, $encoding);
    return array_to_random_string($array, $length);
}

$array = ['あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ'];
$string = implode('', $array);


echo array_to_random_string($array, 8), PHP_EOL;
echo array_to_random_string2($array, 8), PHP_EOL;
echo string_to_random_string($string, 8), PHP_EOL;
&lt;/pre&gt;

&lt;p&gt;
まずは同じ文字を複数回使うことを認める場合について。array_to_random_string の定義を見てみよう。配列からランダムな要素を選ぶ関数として array_shuffle　が用意されているが、戻り値はキーなので、この関数だけを使ってランダムな要素を取り出そうとすると、$array[array_shuffle($array)] と変数を2回書かなければならないので、あらかじめ array_flip を使って値とキーを入れ替えておく。
&lt;/p&gt;

&lt;p&gt;
次に同じ文字を複数回使うことを認めない場合について。array_to_random_string2 の定義を見てみよう。引数の配列の要素をシャッフルして、必要な長さだけの要素だけを連結する。
&lt;/p&gt;

&lt;p&gt;
最後に、マルチバイトの文字列からランダムな文字列を生成する関数も書いてみた。string_to_random_string を見てみよう。マルチバイト文字列の各文字を要素とする配列に変換し、配列からランダムな文字列に生成する作業をそれぞれの関数に委譲している。
&lt;/p&gt;</description><link>http://blog.sarabande.jp/post/24044615396</link><guid>http://blog.sarabande.jp/post/24044615396</guid><pubDate>Wed, 30 May 2012 12:51:00 +0900</pubDate><category>php</category></item><item><title>array_shift、array_pop は変数以外を渡すと警告が発せられる</title><description>&lt;pre class="prettyprint php"&gt;
&amp;lt;?php

var_dump(
    array_shift([1,2,3,4,5])
    // array_shift([1,2,3,4,5])
    // array_slice([1,2,3,4,5], 1, 2)
    // array_filter([1,2,3,4,5] function($x) {return 0 === $x % 2; } )
);
&lt;/pre&gt;

&lt;p&gt;
array_shift、array_pop に変数以外を渡すと次のような警告が発せられた。array_slice や array_filter は OK。PHP 5.4 の次のバージョンでは empty 関数の引数が変数に限られる制限が取り払われたが、配列の関数群にも規制緩和の波が来てもいいような木がしてきた。
&lt;/p&gt;

&lt;pre class="prettyprint bash"&gt;
PHP Strict Standards:  Only variables should be passed by reference in /Users/masakielastic/test.php on line 9
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/24003654486</link><guid>http://blog.sarabande.jp/post/24003654486</guid><pubDate>Wed, 30 May 2012 02:15:50 +0900</pubDate><category>php</category></item><item><title>unset、array_shift、array_pop、array_slice、array_filter</title><description>&lt;p&gt;
配列の要素の削除について。array_shift、array_pop はそれぞれ配列の先頭、最後の要素を削除。unset はキーを指定することでピンポイントで削除。array_slice は指定したオフセットから連続する要素を削除できる。array_filter は述語関数の満たさない要素を削除する。述語関数を指定しなければ空の要素を削除する。空の要素は empty 関数であげられているもの。
&lt;/p&gt;

&lt;pre class="prettyprint php"&gt;
&amp;lt;?php

$a = [1,2,3,4,5];
$b = [1,2,3,4,5];
$c = [1,2,3,0,0.0,"0",null,false,[]];

var_dump(
    array_shift($a), // 1 [1=&amp;gt;2,2=&amp;gt;3,3=&amp;gt;4,4=&amp;gt;5]
    array_pop($a) // 5 [1=&amp;gt;2,2=&amp;gt;3,3=&amp;gt;4]
);

unset($a[3]); // [1=&amp;gt;2,1=&amp;gt;4]

var_dump(
    array_slice($b, 1, 2), // [1=&amp;gt;2,2=&amp;gt;3]
    array_filter($b, function($x) {return 0 === $x % 2; } ), // [1=&amp;gt;2,3=&amp;gt;4]
    array_filter($c) // [1=&amp;gt;2,2=&amp;gt;3,3=&amp;gt;4]
);
&lt;/pre&gt;</description><link>http://blog.sarabande.jp/post/23999841853</link><guid>http://blog.sarabande.jp/post/23999841853</guid><pubDate>Wed, 30 May 2012 00:47:32 +0900</pubDate><category>php</category><category>配列</category></item></channel></rss>

