2016-09-12 23 views
1

一致するアイテムのキーをarray_searcharray_columnにするにはどうすればよいですか?PHP array_searchとarray_columnで一致するアイテムのキーを保持する方法は?

$items = array(
    'meta-title' => [ 
     "code" => 'meta-title' 
    ], 

    'meta-keywords' => [ 
     "code" => 'meta-keywords' 
    ], 
); 

$key = array_search('meta-title', array_column($items, 'code')); 
var_dump($key); // 0 

私は後だ結果:

'meta-title' 

任意のアイデア?

+0

申し訳ありません。上記の私の編集をチェックしてください。ありがとう。 – laukok

+1

あなたは複数のステートメントに分割し、代わりに 'in_array'を使用しますか? 1.すべての列を取得する2. 'in_array'を使って列があるかどうかをチェックする3.' true'なら列名を知る。 – zerkms

+0

どうすればそれで済むでしょうか? – laukok

答えて

1

array_columns()呼び出しは、検索したい配列(つまり、2番目のレベルからの 'code'値の配列)ではなく、数値的にインデックスされた文字列の配列を(第1レベルのキーに基づいて) 。あなたは$itemsを反復し、あなたを介して反復している配列を検索するに基づく配列(キー/値のペア)を構築したほうが良いかもしれません。ここで

$items = array(
    'meta-title' => [ 
     'code' => 'meta-title' 
    ], 

    'meta-keywords' => [ 
     'code' => 'meta-keywords' 
    ], 
); 

$results = array(); 
foreach ($items as $key => $value) { 
    $result = array_search('meta-title', $value); 
    if ($result !== false) { 
     array_push($results, array($key => $result)); 
    } 
} 

http://sandbox.onlinephpfunctions.com/code/71934db55c67657f0336f84744e05097d00eda6d

1

ができるようにするオブジェクト指向のアプローチであります列と検索値を実行時に設定します。クラスとして、再利用可能で、いくらか自己文書化しています。私のミス

<?php 
$items = array(
    'meta-title' => [ 
     "code" => 'meta-title' 
    ], 

    'meta-keywords' => [ 
     "code" => 'meta-keywords' 
    ], 
); 


/** 
* Search all records of a recordset style array for a column containing a value 
* Capture the row into matches member for later use. 
*/ 
class ColumnSearch { 

    private $key; 
    private $search; 

    public $matches=array(); 

    public function __construct($key, $search){ 
     $this->key = $key; 
     $this->search = $search; 
    } 

    public function search(array $items){ 
     // @todo validate $items is like a recordset 
     $matches = array_filter($items, array($this, "_filter"), ARRAY_FILTER_USE_BOTH); 
     $this->matches = $matches; 
     return count($matches); 
    } 

    private function _filter($row, $rowKey){ 
     return ($row[$this->key] == $this->search); 
    } 
} 

$search = new ColumnSearch('code', 'meta-title'); 

$occurances = $search->search($items); 

// return value indicates how many were found, in case of multiples... 
echo $occurances ." ". PHP_EOL; 

// the matched row will be in matches member. 
var_dump($search->matches); 

// there might be more than 1, not in your example but this is very generic code. 
// grab just the keys, then get the current 
echo current(array_keys($search->matches)) . PHP_EOL; 

echo "New Search for value that doesn't exist.". PHP_EOL; 
$newSearch = new ColumnSearch('code', 'title'); 
$count = $newSearch->search($items); 
if(0 == $count){ 
    echo "Nothing found.". PHP_EOL; 
} 
echo current(array_keys($newSearch->matches)); 

http://sandbox.onlinephpfunctions.com/code/83b306bfc30ef2a055cf49501bdeb5cb2e5b5ed7

関連する問題