配列内に指定する値が存在するかチェックする | in_array

in_arrayは配列内に指定値が存在するなら"1"を、存在しないなら"0"を返す。
見つかった場所(index番号)を返すわけではない。

ソースコード

	$ary = ['黒い礼服','茶を一杯','赤い人参','橙のみかん','黄色','緑','青','紫','灰','白'];
	if(in_array('赤い人参', $ary)){
		echo '配列内に存在する';
	}else{
		echo '配列内に存在しない';
	}
	

出力
	配列内に存在する	


配列のポインタ移動を検証 | end,reset,current,each,next,prev

サンプル配列


	$animals = array(
			'neko'=>'ネコ',
			'yagi'=>'ヤギ',
			'kani'=>'カニ',
			'same'=>'サメ',
	);
	

検証1

endで末尾要素を取得したあと、currentで現在要素を取得すると末尾の要素が取得される。
内部ポインタが末尾に移動しているためである。

	$last = end($animals);
	$v = current($animals);
	echo $v; // → サメ
	

検証2

内部ポインタを末尾に移動してもeachには影響なし

	$last = end($animals);
	echo $last; // → サメ
	
	foreach($animals as $key => $val){
		echo $key . '→' . $val . '<br>';
	}
	
	neko→ネコ
	yagi→ヤギ
	kani→カニ
	same→サメ
	

検証3

resetを実行すると内部ポインタは先頭に戻る。

	$last = end($animals);
	reset($animals);
	$v = current($animals);
	echo $v; // → ネコ
	

検証4

内部ポイントを末尾に移動させたあと、nextを実行すると空が出力される。

	$last = end($animals);
	echo next($animals); // → 空値
	$v = current($animals);
	echo $v; // → 空値
	

検証5

内部ポインタを1つ上にずらしてみる。

	$last = end($animals);
	echo prev($animals); // → カニ
	$v = current($animals);
	echo $v; // → カニ
	

検証6

内部ポインタが先頭に状態でprevを実行すると空が出力される

	echo prev($animals); // → 空値
	$v = current($animals);
	echo $v; // → 空値
	

配列の末尾を取得

	
	$last = end($ary);
	reset($ary); // 配列の内部ポインタを先頭に戻す
	

キー用の配列と値用の配列を合成し、キー付きのデータ配列を作成する


	$ary1 = ['cat','dog','pig'];
	$ary2 = ['猫','犬','豚'];
	$ary3 = array_combine($ary1,$ary2);
	var_dump($ary3);
	
出力
array (size=3)
	  'cat' => string '猫' (length=3)
	  'dog' => string '犬' (length=3)
	  'pig' => string '豚' (length=3)
	

配列の先頭キーを取得する


	$arr = array('neko'=>'猫',0=>'零',1=>'壱');
	reset($arr); // 配列の内部ポインタを先頭に戻す。next関数やprev関数で内部ポインタを移動していないときは省略できる。
	$first_key = key($arr);
	var_dump($first_key); // → neko
	

配列の反転


	$ary1 = array('neko','犬','ブタ','KANI');
	$ary1= array_flip($ary1);
	var_dump($ary1);
	

	array (size=4)
	  'neko' => int 0
	  '犬' => int 1
	  'ブタ' => int 2
	  'KANI' => int 3
	


データ構造タイプを取得(0:空 , 1:プリミティブ型 ,2:エンティティ型 , 3:データ型)


<?php 
$data1 = null;
$data2 = 'cat';
$data3 = ['cat','dog'];
$data4 = [
		['name'=>'cat','wamei'=>'ネコ'],
		['name'=>'dog','wamei'=>'イヌ'],
		];
$data5 = array();
$data6 = 0;

$d_struct_type = getDataStructureType($data1);
echo '$data1 → ' . $d_struct_type . '<br>';

$d_struct_type = getDataStructureType($data2);
echo '$data2 → ' . $d_struct_type . '<br>';

$d_struct_type = getDataStructureType($data3);
echo '$data3 → ' . $d_struct_type . '<br>';

$d_struct_type = getDataStructureType($data4);
echo '$data4 → ' . $d_struct_type . '<br>';

$d_struct_type = getDataStructureType($data5);
echo '$data5 → ' . $d_struct_type . '<br>';

$d_struct_type = getDataStructureType($data6);
echo '$data6 → ' . $d_struct_type . '<br>';


/**
 * データ構造タイプを取得する。
 * 
 * @note
 * データ構造タイプは4種類(0:空 , 1:プリミティブ型 ,2:エンティティ型 , 3:データ型)
 * 
 * @param $value
 * @return int データ構造タイプ
 */
function getDataStructureType($data){
	if($data === null) return 0; // 空
	
	if(is_array($data)){
		if(count($data) == 0){
			return 2; // エンティティ型
		}else{
			$first = reset($data); // $first→猫
			if(is_array($first)){
				return 3; // データ型
			}else{
				return 2; // エンティティ型
			}
		}
	}
	return 1; // プリミティブ型
	
}
?>

出力

$data1 → 0
$data2 → 1
$data3 → 2
$data4 → 3
$data5 → 2
$data6 → 1

配列の階層の深さを調べる

サンプル


	$data['neko'][1]['mike'] = 'sallcat';
	$data[0] = 1;
	$data['animal'][1] = 'bigcat';
	$data['animal'][2]['konchu'][2] = 'kuro-ari';
	$data['fish']='fish';
	
	$depth = arrayDepth($data);
	echo "depth={$depth}<br>";
	
	$depth2 = arrayDepthSmp($data);
	echo "depth2={$depth2}<br>";
	
	
	/**
	 * 配列の階層の深さを調べる
	 * 
	 * @note
	 * 配列すべてをサーチするので処理は重め
	 * 
	 * @param array $ary 対象配列
	 * @param number $depth 深度(再起呼び出しで使用するので省略すること)
	 * @return number 階層数
	 */
	function arrayDepth(&$ary, $depth=0){
		if(is_array($ary)){
			$depth++;
			
			$max_depth = 0;
			foreach($ary as $value){
				$dep = arrayDepth($value, $depth);
				if($dep > $max_depth) $max_depth = $dep;
			}
			return $max_depth;
			
		}else{
			return $depth;
		}
	}
	
	/**
	 * 配列の階層の深さを調べる(高速版)
	 *
	 * @note
	 * 配列の先頭からのみ深度を調べる。
	 * 処理は速いが、階層にばらつきのある配列には向かない。
	 * 行列データなどに。
	 *
	 * @param array $ary 対象配列
	 * @param number $depth 深度(再起呼び出しで使用するので省略すること)
	 * @return number 階層数
	 */
	function arrayDepthSmp(&$ary, $depth=0){
		if(is_array($ary)){
			$depth++;
			$first_key = key($ary);
			$depth = arrayDepthSmp($ary[$first_key], $depth);
		}
		return $depth;
	}
	

出力

	depth=4
	depth2=3
	

配列先頭の値を取得


	$ary = array();
	$ary[0] = 'dog';
	$ary['animal'] = 'cat';
	$first = current($ary);
	var_dump($first); // → dog
	

空配列の場合


	$ary = array();
	$first = current($ary);
	var_dump($first); // → false
	

配列内を値で検索し、キーを取得する | array_searchの検証


<?php 
$list = [
		'yakusima' => 'ヤクシマタゴガエル',
		'tokyo' => 'トウキョウダルマガエル',
		'chousen' => 'チョウセンヤマアカガエル',
		'tusima' => 'ツシマアカガエル',
		'test1' => '\'',
		'test2' => '&',
		'test3' => '"',
		'test4' => '$',
		'test5' => '\',
		'tonosama' => 'トノサマガエル',
		'ryokyu' => 'リュウキュウアカガエル',
	];

echo "<pre class='console'>";
$key = array_search('ツシマアカガエル', $list);
echo $key . '<br>';
$key = array_search('ニョロボン', $list);
echo $key . '<br>';
$key = array_search('\'', $list);
echo $key . '<br>';
$key = array_search('&', $list);
echo $key . '<br>';
$key = array_search('"', $list);
echo $key . '<br>';
$key = array_search('$', $list);
echo $key . '<br>';
$key = array_search('\', $list);
echo $key . '<br>';
echo "</pre>";
?>

出力

tusima

test1
test2
test3
test4
test5