PHPプログラムに関する各種メモ書き:タグ「配列」での検索

phpで配列を文字数の多い順にソート(並び替え)する

phpで配列を文字数の多い順にソート(並び替え)するには以下のようにします。

● 普通の配列の場合は usort() を使用します

usort($output_array, create_function('$b,$a', 'return mb_strlen($a, "UTF-8") - mb_strlen($b, "UTF-8");'));

● 連想配列の場合は uasort() を使用します

uasort($output_array, create_function('$b,$a', 'return mb_strlen($a, "UTF-8") - mb_strlen($b, "UTF-8");'));

例:

$my_array = array(
	'あいうえお' ,
	'12345789' ,
	'長い長い文字列のテストです。' ,
);
print_r($my_array);
usort($my_array, create_function('$b,$a', 'return mb_strlen($a, "UTF-8") - mb_strlen($b, "UTF-8");'));
print_r($my_array);

結果 :

Array
(
    [0] => あいうえお
    [1] => 12345789
    [2] => 長い長い文字列のテストです。
)
Array
(
    [0] => 長い長い文字列のテストです。
    [1] => 12345789
    [2] => あいうえお
)

引用元 : https://goo.gl/uhhq1Z

No.1179
12/03 16:12

edit

配列
ソート

Strict Standards: Only variables should be passed by reference エラーへの対応

PHP5.6以降では配列関係の参照渡しの関数にデータを渡す時は一度変数に入れる必要があります。

● エラーとなる例

$new_array = end( array_keys($array) );

● このように変更します

$ar_key = array_keys($array);
$new_array = end( $ar_key );
No.1089
02/08 18:30

edit

配列
エラー対処

PHPで配列の重複した値を取り除く

● 重複した値を持つ配列を重複値を綺麗に取り除く

AAA
BBB
DDD
DDD
FFF

 ↓

AAA
BBB
DDD
FFF

PHPコードは

$my_ar = array(
  'AAA' ,
  'BBB' ,
  'DDD' ,
  'DDD' ,
  'FFF' ,
);
print_r($my_ar);
$my_ar = array_merge(array_unique($my_ar));
print_r($my_ar);

です。

● 配列に重複があるかどうかチェックする 関数

重複がある時に true を返します

function array_same_values($array) {
    return array_unique($array) !== $array;
}

です。 引用 : http://bit.ly/1MRi1fr

No.1021
04/06 13:59

edit

配列

PHPのforeachループ内で「配列の最初かどうか?」「最後かどうか?」を調べる

PHPでforeachループで回している時に、配列の先頭かどうか?最後かどうか?を調べるには次のようにします。

foreach ($hash as $k => $v) {
    if (reset(array_keys($hash)) === $k) {
        print "先頭の要素です";
    }
    if (end(array_keys($hash)) === $k) {
        print "最後の要素です";
    }
}
No.926
02/23 16:27

edit

配列

多次元配列(ハッシュの配列)を並び替える、またはランダム順にする。

データベースから取得したデータをPHP内で並べ替えたり、ランダムに並び替えたい時があります。 関数【array_multisort】を使ってタイトルでソートするには以下のようにすればOKです。

$loop = array(
    array(
        'id' => 1,
        'title' => 'あいうえお',
    ),
    array(
        'id' => 2,
        'title' => 'かきくけこ',
    ),
    array(
        'id' => 3,
        'title' => 'さしすせそ',
    ),
);
$ids = array();
foreach ($loop as $value) {
    array_push($ids,$value['title']);
}
// shuffle($ids);   // もしランダムにソートする場合はこのコメントアウトを解除する
array_multisort($ids, SORT_DESC, $loop);

実際には次のように実装します

    /**
     * このメソッドはハッシュの配列を任意のカラムでソートします
     *
     * @param   array       $loop
     * @param   string      $column_name
     *
     * @return  array       $loop
     */
    public function loop_sort( $loop, $column_name ){
        $ids = array();
        foreach ($loop as $value) {
            array_push($ids,$value[$column_name]);
        }
        array_multisort($ids, SORT_DESC, $loop);
        return $loop;
    }

次のように呼び出します。(titleでソートする場合)

$sorted_loop = $this->loop_sort( $original_loop, 'title' );

簡単ですね!

No.775
12/03 15:47

edit

配列
ソート

Smarty の プラグインへの引数指定方法

通常( $data を myplugin に渡す )

{$data|myplugin}

引数を2つ($data1, $data2)渡す

{$data1|myplugin:$data2}

引数を3つ($data1, $data2, $data3)渡す

{$data1|myplugin:$data2:$data3}

配列や連想配列($ar_data)を引数として渡す

{$ar_data|@myplugin}

No.649
09/15 14:01

edit

Smarty
配列

配列(の配列)の文字コードを一括変換する

http://d.hatena.ne.jp/seto-san/20081203/1228274418

にありました。

以下引用。(クラスメソッドとして記述してあるので、通常の関数として使用したい場合は)

$target[$key] = $this->_mbConvertEncodingEx($val,$toEncoding,$fromEncoding);
↓
$target[$key] = _mbConvertEncodingEx($val,$toEncoding,$fromEncoding);

とするとよいでしょう。

/**
 * mb_convert_encoding()の拡張
 *
 * @param  mixed  $target       arrayかstring
 * @param  string $toEncoding   エンコード先
 * @param  string $fromEncoding エンコード元(default:null)
 * @return mixed  arrayが来たらarrayを、stringが来たらstringを
 */
function _mbConvertEncodingEx($target, $toEncoding, $fromEncoding = null)
{
  if (is_array($target)) {
    foreach ($target as $key => $val) {
      if (is_null($fromEncoding)) {
        $fromEncoding = mb_detect_encoding($val);
      }
      $target[$key] = $this->_mbConvertEncodingEx($val,$toEncoding,$fromEncoding);
    }
  } else {
    if  (is_null($fromEncoding)) {
      $fromEncoding = mb_detect_encoding($target);
    }
    $target = mb_convert_encoding($target, $toEncoding,$fromEncoding);
  }
  return $target;
}

No.648
11/12 11:21

edit

配列

Smartyで配列の最初と最後の要素を検知する

Smartyで配列の最初、最後を検知するには ループ名(任意)をつけて

.first

.last

で知ることが出来ます。

{ foreach from=$test_loop key="k" item="v" name="loopname"}
{ if $smarty.foreach.loopname.first }(最初の要素){$v.name}です。{ /if }
{ $v.name }です。
{ if $smarty.foreach.loopname.last }(最後の要素){$v.name}です。{ /if }
{ /foreach }

ちなみに配列の長さは @count で求めることが出来ます

{$test_loop|@count}
No.601
11/01 11:18

edit

Smarty
配列

Smarty でテンプレート側で配列の長さ(要素数)を求める

Smartyはテンプレート内でPHP標準関数が使用できます。

なので

配列 $loop の要素数を知るには

{$loop|@count}

でOKです


if文で使用するには

{ if count($loop) > 0 }要素数は1以上です{/if}

計算式で使用するには( 例:$loopの要素数に2を足す )

{ math equation=a+b a=$loop|@count b=2 assign=kekka }
{$kekka}

No.583
01/21 11:11

edit

配列
Smarty

連想配列から配列の値を削除する

phpの連想配列(ハッシュ)で

$hash=array(
 'aa' => 'aiueo' ,
 'bb' => 'kakikukeko' ,
 'cc' => 'sasisuseso' ,
);

という配列から $hash['bb'] のキーと値を削除するには

unset($hash['bb']);

とします。

※ なおこれは普通の配列には使用しない方がいいです。(削除した配列は「欠番」となりますので、それより後ろのメンバがつまるわけではないため)

普通の配列には array_splice() を使用しましょう。

array_splice ( array &$input , int $offset [, int $length [, mixed $replacement = array() ]] )

配列 input から offset および length で指定された要素を削除し、配列 replacement でそれを置換します


※ 普通の配列の「欠番」をつめる array_values() というのもあります(パフォーマンスをあまり気にしない局面では使えると思います)

```

$list = array_values($list);

```

No.545
02/22 20:05

edit

配列

配列を自然順アルゴリズムでソートを行う【natsort】【natcasesort】

普通にソートすると

 img1.png
 img2.png
 img10.png
 img12.png

となってしまう配列を

img1.png
img10.png
img12.png
img2.png

でソートするのが自然順アルゴリズムによるソート(人間が認識しやすいソート)

これは

$arr=new array(
'img2.png',
'img12.png',
'img1.png',
'img10.png'
);
natsort($arr);

で実行できます。

natsort(配列):自然順アルゴリズムによるソート
natcasesort(配列):自然順アルゴリズムによるソート(大文字小文字の違いを無視)
No.453
11/12 11:23

edit

配列

Smartyで 配列の中に要素があるかを調べる (in_array )

Smartyで PHP のin_array を使いたいなと思ったんですが、プラグインを書かなくても使えます。

$shop_idが配列$listの中に入っているかどうかを調べるには以下のようにする
テンプレートファイル内で以下のように記述する。
{if $shop_id|in_array:$list}すでに入っています
{else}配列の中には存在しません
{/if}

No.354
03/23 13:56

edit

Smarty
配列

多次元配列を結合する

配列を再起的に結合するには

array_merge_recursive

を使用する

array_merge_recursive ( array 配列1, array 配列2 )
No.276
08/12 10:15

edit

配列

Smartyで配列かどうかを判別するには?

Smartyで配列かどうかを判別するには is_array を使用します

{ if is_array($data) }
  { foreach from=$data key="k" item="v" name="loopname" }
    {$v|escape}
  { /foreach }
{ else }
  {$data|escape}
{ /if }
No.262
07/14 15:34

edit

Smarty
配列

チェックボックスの値を配列で受け取るため name="check[]" とするとJavaScriptで値が受け取れない問題について

JavaScriptでチェックボックスの値を受け取るには

<form name="FM">の<input type="checkbox" name="order_no[]">時
// form_name
var form_name = 'order_no[]';

// length
alert('合計' + document.FM.elements[form_name].length + '個のチェックボックスがあります');

// value
value_array = new Array();
for (i=0; i<document.FM.elements[form_name].length; i++ ){
	if(document.FM.elements[form_name][i].checked == true){
		value_array.push(document.FM.elements[form_name][i].value);
	}
}
alert('合計' + value_array.length + '個チェックされています');
alert(value_array);
No.222
03/31 15:33

edit

配列