我也不知道該怎麼表達,總之需求有點類似C#裡面的linq,
假如有如下數組
<code>$test = [ 'a'=>'a1', 'b'=>'a1', 'c'=>'c1', ] </code>
我現在可以透過$test['a']查詢到'a1',但是我也想透過'a1'來反查到'a'和'b'兩個元素,請問如何在php中實現這個?
補充:有人說用foreach實現,但是我這個數組到後期有可能非常大,甚至大到幾千上萬,用foreach肯定效率不高。
已有的解決方案只能解決每個數組元素鍵值不一樣的情況,也就是一對一映射的情況,1是array_search,2是先array_flip再用傳統的$test['a1']查找。
我也不知道該怎麼表達,總之需求有點類似C#裡面的linq,
假如有如下數組
<code>$test = [ 'a'=>'a1', 'b'=>'a1', 'c'=>'c1', ] </code>
我現在可以透過$test['a']查詢到'a1',但是我也想透過'a1'來反查到'a'和'b'兩個元素,請問如何在php中實現這個?
補充:有人說用foreach實現,但是我這個數組到後期有可能非常大,甚至大到幾千上萬,用foreach肯定效率不高。
已有的解決方案只能解決每個數組元素鍵值不一樣的情況,也就是一對一映射的情況,1是array_search,2是先array_flip再用傳統的$test['a1']查找。
手冊中的array_search可以解決你的需求。
<code class="php"><?php $array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red'); $key = array_search('green', $array); // $key = 2; $key = array_search('red', $array); // $key = 1; ?> </code>
在群組裡面請教大神解決了,array_keys就好了。
<code><?php $a=array("a"=>"Dog","b"=>"Dog","c"=>5,"d"=>"5"); print_r(array_keys($a,"Dog")); //Array ( [0] => a [1] => b ) ?> </code>
直接上程式碼吧! ~
沒啥好辦法,兩個陣列來搞吧
謝謝邀請, 因為數組結構的key
肯定是唯一的, 但可能不同的key
對應相同的值, 所以我所知道的, 要想實現c#
的linq
, 需要保證數組的值唯一,
<code class="php">$test = [ 'a' => 'a1', 'b' => 'b1', 'c' => 'c1', 'd' => 'd1', 'e' => 'd1' ]; //去除重复的值 $test = array_unique($test);</code>
去除重複值後, 使陣列反轉,
<code class="php">$test = [ 'a' => 'a1', 'b' => 'b1', 'c' => 'c1', 'd' => 'd1', 'e' => 'd1' ]; $test = array_unique($test); $wocao = array_flip($test); var_dump($wocao); </code>
反轉結構把原數組的key
當作值, 原數組的value
作為key
, 如下
<code>array(4) { ["a1"]=> string(1) "a" ["b1"]=> string(1) "b" ["c1"]=> string(1) "c" ["d1"]=> string(1) "d" }</code>
現在, 可以實現類似c#
的linq功能了
<code>$test = [ 'a' => 'a1', 'b' => 'b1', 'c' => 'c1', 'd' => 'd1', 'e' => 'd1' ]; $test = array_unique($test); $wocao = array_flip($test); $test['a']; //a1 $wocao['a1']; //a</code>
不足之處請多指出,,,
不就是根據值查詢鍵麼,一個 array_keys 就能解決了呀:
<code>$arr = array('a' => 'a1', 'b' => 'a1', 'c' => 'c1'); var_export( array_keys($arr, 'a1') ); //输出键名 a 和 b</code>