PHP 多次元配列 ループを使わないキーの削除方法を教えてください。


1.下記のような多次元配列があるとします。
$array[1][1] = 1;
$array[1][2] = 1;
$array[1][3] = 1;
$array[2][1] = 1;
$array[2][2] = 1;
$array[2][3] = 1;

2.2つめの次元の[1]というキーのものを全て削除し下記のような結果にしたいです。
$array[1][2] = 1;
$array[1][3] = 1;
$array[2][2] = 1;
$array[2][3] = 1;

3.foreach等のループを行わず高速に削除できる方法はありますでしょうか?
<<イメージ例>>
unset($array[*][1]);
※ *のような全指定キーがあればベストだと思うのですが。。

phpのバージョン等はどのバージョンでも結構です。
どうぞ宜しくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/09/13 00:00:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

ポイント50pt

一例

<?php
$a[1][1] = 11;
$a[1][2] = 12;
$a[1][3] = 13;
$a[2][1] = 21;
$a[2][2] = 22;
$a[2][3] = 23;

$f = create_function('$v,$k,$a', 'unset($a[$k][1]);');
array_walk($a, $f, &$a);

var_dump($a);

http://jp.php.net/manual/ja/function.create-function.php
http://jp.php.net/manual/ja/function.array-walk.php

id:cheesKT

ご回答ありがとうございます。
他方法と実行速度を比較してみたいと思います。

2012/09/06 04:30:22
id:windofjuly

バージョン不明で、実際のデータ仕様も不明なため、
改良しやすく2行に分けたのですが、
使い回しとか考えなくて、速度最優先なら下記でどうぞ。

<?php
$a[1][1] = 11;
$a[1][2] = 12;
$a[1][3] = 13;
$a[2][1] = 21;
$a[2][2] = 22;
$a[2][3] = 23;

array_walk($a, function(&$v){ unset($v[1]); } );

var_dump($a);
2012/09/06 04:49:52

その他の回答1件)

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493

ポイント50pt

これは違う?

<?php
function pr($var) {
	echo '<pre>'; print_r($var); echo '</pre>';
}
$data = array(
	array('a', 'b', 'c'),
	array('A', 'B', 'C')
);
$data = array_map(function($e) {
	array_shift($e);
	return $e;
}, $data);
pr($data);
id:cheesKT

説明不足で申し訳ございません。
配列の先頭を削除(array_shift)したいのではなく、指定して削除したいと考えております。
ただ関数を少しいじればそれも実現できそうですね。
他方法と実行速度を比較してみたいと思います。

2012/09/06 04:16:11
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント50pt

一例

<?php
$a[1][1] = 11;
$a[1][2] = 12;
$a[1][3] = 13;
$a[2][1] = 21;
$a[2][2] = 22;
$a[2][3] = 23;

$f = create_function('$v,$k,$a', 'unset($a[$k][1]);');
array_walk($a, $f, &$a);

var_dump($a);

http://jp.php.net/manual/ja/function.create-function.php
http://jp.php.net/manual/ja/function.array-walk.php

id:cheesKT

ご回答ありがとうございます。
他方法と実行速度を比較してみたいと思います。

2012/09/06 04:30:22
id:windofjuly

バージョン不明で、実際のデータ仕様も不明なため、
改良しやすく2行に分けたのですが、
使い回しとか考えなくて、速度最優先なら下記でどうぞ。

<?php
$a[1][1] = 11;
$a[1][2] = 12;
$a[1][3] = 13;
$a[2][1] = 21;
$a[2][2] = 22;
$a[2][3] = 23;

array_walk($a, function(&$v){ unset($v[1]); } );

var_dump($a);
2012/09/06 04:49:52

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません