トップページに戻る    Cマガ電脳クラブで勉強したこと    オートコンプリート    PHPメモ    正規表現メモ    サクラエディタの設定

LINQに対応したPHPの配列の操作


目次

001. Take(3)
002. Skip(3)
003. First()
004. Last()
005. Where(述語)
006. Intersect(列挙)
007. Except(列挙)
008. Contains(要素)
009. Reverse()
010. OrderBy(ソート条件)


001 Take(3)

array_slice関数が使える。

<?php
var_export(
    array_slice(['AAA','BBB','CCC','DDD','EEE'] , 0 , 3)
);
// array (
//   0 => 'AAA',
//   1 => 'BBB',
//   2 => 'CCC',
// )

var_export(
    array_slice([] , 0 , 3)
);
// array (
// )


002 Skip(3)

array_slice関数が使える。

<?php
var_export(
    array_slice(['AAA','BBB','CCC','DDD','EEE'] , 3)
);
// array (
//   0 => 'DDD',
//   1 => 'EEE',
// )

var_export(
    array_slice(['AAA','BBB'] , 3)
);
// array (
// )


003 First()

array_keys関数が使える。

<?php
$wk_arr = [ 2 => 'CCC' , 5 => 'EEE'];

$FirstKey = array_keys($wk_arr)[0];
$FirstVal = $wk_arr[$FirstKey];

echo "FirstKey = {$FirstKey} , FirstVal = {$FirstVal}";
// FirstKey = 2 , FirstVal = CCC

PHP 7.3からは、array_key_first関数が使える。


004 Last()

array_keys関数が使える。

<?php
$wk_arr = [ 2 => 'CCC' , 4 => 'EEE'];

$UB = count($wk_arr) - 1;
$LastKey = array_keys($wk_arr)[$UB];
$LastVal = $wk_arr[$LastKey];

echo "LastKey = {$LastKey} , LastVal = {$LastVal}";
// LastKey = 4 , LastVal = EEE

PHP 7.3からは、array_key_last関数が使える。


005 Where(述語)

array_filter関数が使える。

<?php
$wk_arr = [ 'AAA' , 'BBB' , 'CCC' , 'DDD' , 'EEE' ];

$OKVal1 = 'BBB';
$OKVal2 = 'DDD';

$filtered_arr = array_filter($wk_arr,
                             function($pVal) use($OKVal1,$OKVal2) {
                                 return $pVal == $OKVal1
                                     || $pVal == $OKVal2;
                             });
var_export($filtered_arr);
// array (
//   1 => 'BBB',
//   3 => 'DDD',
// )

var_export(array_values($filtered_arr));
// array (
//   0 => 'BBB',
//   1 => 'DDD',
// )

添字が数値の配列にarray_filter関数を使うと、
添字に歯抜けが発生することがあり、
歯抜けを詰めるには、array_values関数を使用する。


006 Intersect(列挙)

array_intersect関数が使える。

<?php
$wk_arr1 = array(1 => 'AAA', 3 => 'CCC');
$wk_arr2 = array(2 => 'BBB', 4 => 'CCC');

var_export(array_intersect($wk_arr1,$wk_arr2));
// array (
//   3 => 'CCC',
// )


007 Except(列挙)

array_diff関数が使える。

<?php
$wk_arr1 = array(1 => 'AAA', 2 => 'BBB');
$wk_arr2 = array(3 => 'BBB', 4 => 'CCC');

var_export(array_diff($wk_arr1,$wk_arr2));
// array (
//   1 => 'AAA',
// )


008 Contains(要素)

in_array関数が使える。

<?php
$is_exists = in_array('AAA' , ['AAA','BBB','CCC']);
echo $is_exists ? 'AAAが要素に存在します。' : 'AAAは要素に存在しません。';
// AAAが要素に存在します。


009 Reverse()

array_reverse関数が使える。

<?php

// ■■■ 添字が数値の配列の場合 ■■■
$NumArrSei = [777,888,999];
$NumArrRev = array_reverse($NumArrSei);

var_export($NumArrSei);
// array (
//   0 => 777,
//   1 => 888,
//   2 => 999,
// )

var_export($NumArrRev);
// array (
//   0 => 999,
//   1 => 888,
//   2 => 777,
// )

// ■■■ 連想配列の場合 ■■■
$AssocArrSei = ['CCC' => 555 , 'EEE' => 999 , 'AAA' => 111];
$AssocArrRev = array_reverse($AssocArrSei);

var_export($AssocArrSei);
// array (
//   'CCC' => 555,
//   'EEE' => 999,
//   'AAA' => 111,
// )

var_export($AssocArrRev);
// array (
//   'AAA' => 111,
//   'EEE' => 999,
//   'CCC' => 555,
// )


010 OrderBy(ソート条件)

数値や文字列の配列の場合は、sort関数が使える。
連想配列の配列の場合は、usort関数やarray_multisort関数が使える。
PHP8からは安定ソートだが、PHP7までは安定でないソートとなる。

<?php

// ■■■ 数値や文字列の配列の場合 ■■■
$NumIndArr = [9,111,5];
sort($NumIndArr);
var_export($NumIndArr);
// array (
//   0 => 5,
//   1 => 9,
//   2 => 111,
// )

// ■■■ 連想配列の配列の場合 ■■■
$selected_line_arr = [];
$selected_line_arr[] = ['ID' => 1 , 'NumVal' => 111];
$selected_line_arr[] = ['ID' => 2 , 'NumVal' => 999];
$selected_line_arr[] = ['ID' => 3 , 'NumVal' => 555];
$selected_line_arr[] = ['ID' => 4 , 'NumVal' => 555];

// order by NumVal desc,ID asc な並びにソートする

// 方法1 usort関数でソート
usort($selected_line_arr,
      function($pA , $pB){
          if($pA['NumVal'] < $pB['NumVal']) return  1;
          if($pA['NumVal'] > $pB['NumVal']) return -1;
          if($pA['ID']     > $pB['ID'])     return  1;
          if($pA['ID']     < $pB['ID'])     return -1;
          return 0;
      });

// 方法2 array_multisort関数でソート
$SortKey1 = [];
$SortKey2 = [];
foreach($selected_line_arr as $EachKey => $EachVal){
    $SortKey1[$EachKey] = $EachVal['NumVal'];
    $SortKey2[$EachKey] = $EachVal['ID'];
}
array_multisort($SortKey1,SORT_DESC,$SortKey2,SORT_ASC,$selected_line_arr);

var_export($selected_line_arr);
// array (0 => array ( 'ID' => 2 , 'NumVal' => 999),
//        1 => array ( 'ID' => 3 , 'NumVal' => 555),
//        2 => array ( 'ID' => 4 , 'NumVal' => 555),
//        3 => array ( 'ID' => 1 , 'NumVal' => 111),
// )