PHPの配列内の特定の値のインデックスを取得します


87

私は配列を持っています:

$list = array('string1', 'string2', 'string3');

特定の値(つまり1、forstring2および2for string3)のインデックスを取得したい

必要なのは、配列内の文字列の位置です

  • string1は0です
  • string2は1です
  • string3は2です

これを達成する方法は?


8
私のテクニカルライターの友人は、「正しい質問をしない限り、正しい答えを得ることができない」と私に言いました。
ビルカーウィン2010年

これは古いです....しかし、理由を知りたいと思いました
dsdsdsdsd 2014

高い評価の回答を承認済みとしてマークしてください。
robsch 2015年

私がしたように、連想配列がある場合、この回答は役立ちます:stackoverflow.com/a/3365793/470749
Ryan

回答:


159

array_search それを行う方法です。

array_search ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : mixed

ドキュメントから:

$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;

配列を手動でループしてインデックスを見つけることもできますが、そのための関数があるのになぜそれを行うのですか。この関数は常にキーを返し、連想配列と通常の配列でうまく機能します。


11
これにより、インデックスではなくキーが返されます。あなたの例では、キーは便利なことに値のインデックスです。
ホルヘフェレイラ2010年

1
@ smink、OPの配列は非連想配列であるため、正常に機能します。
Matthew Flaschen 2010年

申し訳ありませんが、配列の種類を指定していません。私が使用している配列は多次元配列です。解決策についての私の答えを参照してください
Aakash Chakravarthy 2010年

私はこのタイプの配列を持っています:[0 => {id:1、name:something}、1 => {.....}、...]。array_search( "name" => something、$ array)のようなキー/インデックスを見つけることは可能ですか?
lazzy_ms

配列に子がある場合はどうですか?
zukijuki

19

それらのいくつかだけを実行している場合(および/または配列サイズが大きい場合)、array_searchで正しい方向に進んでいます:

$list = array('string1', 'string2', 'string3');
$k = array_search('string2', $list); //$k = 1;

すべて(またはそれらの多く)が必要な場合は、ループの方がうまくいく可能性があります。

foreach ($list as $key => $value) {
    echo $value . " in " . $key . ", ";
}
// Prints "string1 in 0, string2 in 1, string3 in 2, "

1
foreachは私が必要としていたものです
zzapper 2014

11

他の人々はarray_search()、値が見つかった配列要素のキーを与えるものを提案しました。次を使用して、配列キーが連続した整数であることを確認できますarray_values()

$list = array(0=>'string1', 'foo'=>'string2', 42=>'string3');
$index = array_search('string2', array_values($list));
print "$index\n";

// result: 1

あなたはあなたの質問でそれarray_search()は役に立たないと言いました。理由を説明できますか?あなたは何を試みましたか、そしてそれはどのようにあなたのニーズを満たしませんでしたか?


「array_values()は役に立たなかった」..「array_search()は役に立たなかった」である必要があります
Vex

7

//または配列構造を検討します:

$array = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => ''),
);

//あなたはただ

function findIndexOfKey($key_to_index,$array){
  return array_search($key_to_index,array_keys($array));
}

//実行

print "\r\n//-- Method 1 --//\r\n";
print '#index of: string1 = '.findIndexofKey('string1',$array)."\r\n";
print '#index of: string2 = '.findIndexofKey('string2',$array)."\r\n";
print '#index of: string3 = '.findIndexofKey('string3',$array)."\r\n";

//あるいは

print "\r\n//-- Method 2 --//\r\n";
print '#index of: string1 = '.array_search('string1',array_keys($array))."\r\n";
print '#index of: string2 = '.array_search('string2',array_keys($array))."\r\n";
print '#index of: string3 = '.array_search('string3',array_keys($array))."\r\n";

//再帰的に

print "\r\n//-- Method 3 --//\r\n";
foreach(array_keys($array) as $key => $value){
  print '#index of: '.$value.' = '.$key."\r\n";
}

//出力

//-- Method 1 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 2 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 3 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

6

問題は、配列に数値インデックスがないことです。
array_values()を使用すると、インデックスがゼロの配列が作成され、forループを使用する必要がないため、array_search()を使用して検索できます。

$list = array('string1', 'string2', 'string3');
$index = array_search('string2',array_values($list));

これは、これまでのところ、質問に対して最も短く、効果的な方法です
Toni TegarSahidi20年

1

もう少し具体的に教えていただけますか?

$key = array_search('string2',$list)

私にとってはうまくいきます。もっと複雑なことを成し遂げようとしていますか?


1

このコードは、新しいルーチンと同じように機能し、正しい多次元配列を操作する必要があります。

 $arr = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => '')
 );

 echo 'Index of "string2" = '. array_search('string2', array_keys($arr));

1
質問は多次元配列について何も言及していません(他の回答のOPによるコメントは、この回答が彼が実際に探していたものであることを示唆していますが、元の質問とこの回答だけを読んだ場合、あなたが言っていることは意味がありません)
StubbornShowaGuy 2016

1

このための関数を作成する必要があります。そのための組み込み関数はないと思います。デフォルトでは、すべてのPHP配列は連想的です。したがって、キーがわからない場合は、次のコードを使用してください。

<?php

$given_array = array('Monday' => 'boring',
'Friday' => 'yay',
'boring',
'Sunday' => 'fun',
7 => 'boring',
'Saturday' => 'yay fun',
'Wednesday' => 'boring',
'my life' => 'boring');

$repeating_value = "boring";

function array_value_positions($array, $value){
    $index = 0;
    $value_array = array();
        foreach($array as $v){
            if($value == $v){
                $value_array[$index] = $value;
            }
        $index++;
        }
    return $value_array;
}

$value_array = array_value_positions($given_array, $repeating_value);

$result = "The value '$value_array[0]' was found at these indices in the given array: ";

$key_string = implode(', ',array_keys($value_array));

echo $result . $key_string . "\n";//Output: The value 'boring' was found at these indices in the given array: 0, 2, 4, 6, 7


0

array_keysPHP関数を試してください。

$key_string1 = array_keys($list, 'string1');

それらのパラメータは逆になりませんか?
ashleedawg

@ashleedawgいいえ、読み間違えましたが、array_keys違いますarray_search
友人

0

array_searchは正常に機能するはずです。これをテストしたところ、期待どおりにキーが返されます。

$list = array('string1', 'string2', 'string3');
echo "Key = ".array_search('string1', $list);
echo " Key = ".array_search('string2', $list);
echo " Key = ".array_search('string3', $list);

または、インデックスには、

$list = array('string1', 'string2', 'string3');
echo "Index = ".array_search('string1', array_merge($list));
echo " Index = ".array_search('string2', array_merge($list));
echo " Index = ".array_search('string3', array_merge($list));

0
$find="Topsite";
$list=array("Tope","Ajayi","Topsite","Infotech");
$list_count=count($list);
sort($list);
for($i=0;$i<$list_count;$i++)
{
    if($list[$i]==$find){
         $position=$i;
    }

}
echo $position;

-1

これは、数値または文字列のインデックスに対して機能する関数です。配列を最初のパラメーターとして渡し、次に移動する必要のある要素のインデックスを渡し、最後に方向を-1に設定して要素を上に移動し、1に設定して要素を下に移動します。例:Move(['first' => 'Peter'、 'second' => 'Paul'、 'third' => 'Kate']、 'second'、-1)は、Paulを上に移動し、Peterを下に移動します。

function Move($a,$element,$direction)
{

$temp = [];
$index = 0;

foreach($a as $key=>$value)
{
    $temp[$index++] = $key;
}

$index = array_search($element,$temp);

$newpos = $index+$direction;

if(isset($temp[$newpos]))
{
        $value2 = $temp[$newpos];
        $temp[$newpos]=$element;
        $temp[$index]=$value2;
}
else
{
    # move is not possible
    return $a; # returns the array unchanged
}   

$final = [];

foreach($temp as $next)
{
    $final[$next]=$a[$next];
}

return $final;

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.