0

私は2つの配列を持っています.1つは名前にIDを含むファイル名を保持し、2つは次のようなデータを含みます:

Array
(
    [0] => Array
        (
            [file] => 103135_cara.jpg
        )

    [1] => Array
        (
            [file] => 103135_corpo.jpg
        )

    [2] => Array
        (
            [file] => 103136_cara.jpg
        )

    [3] => Array
        (
            [file] => 103136_corpo.jpg
        )


Array2
(
    [0] => Array
        (
            [id] => 103137
            [nome] => Eduardo Vieira
            [sexo] => 1
            [datanascimento] => 1983-11-15
            [morada] => R: Gothard Kaesemodel 750 ? Torre 1 - Ap 508
            [localidade] => Joinville
            [cp1] => 
            [cp2] => 
            [tlm] => 479946464
            [email] => eduardo@wetzel.com.br
            [estadocivil] => 1
            [profissao] => 7
        )

    [1] => Array
        (
            [id] => 103138
            [nome] => João Nuno Gonçalves
            [sexo] => 1
            [datanascimento] => 1984-08-13
            [morada] => Rua Elias Garcia Nº325 6D
            [localidade] => Amadora
            [cp1] => 2700
            [cp2] => 323
            [tlm] => 964359799
            [email] => joaoridebmx@yahoo.com
            [estadocivil] => 1
            [profissao] => 7
        )

配列を次のようにマージしました。

Array3
(
    [0] => Array
        (
            [id] => 103137
            [nome] => Eduardo Vieira
            [sexo] => 1
            [datanascimento] => 1983-11-15
            [morada] => R: Gothard Kaesemodel 750 ? Torre 1 - Ap 508
            [localidade] => Joinville
            [cp1] => 
            [cp2] => 
            [tlm] => 479946464
            [email] => eduardo@wetzel.com.br
            [estadocivil] => 1
            [profissao] => 7
            [file1] => 103137_cara.jpg
        )

    [1] => Array
        (
            [id] => 103137
            [nome] => Eduardo Vieira
            [sexo] => 1
            [datanascimento] => 1983-11-15
            [morada] => R: Gothard Kaesemodel 750 ? Torre 1 - Ap 508
            [localidade] => Joinville
            [cp1] => 
            [cp2] => 
            [tlm] => 479946464
            [email] => eduardo@wetzel.com.br
            [estadocivil] => 1
            [profissao] => 7
            [file1] => 103137_cara.jpg
            [file2] => 103137_corpo.jpg
        )

    [2] => Array
        (
            [id] => 103138
            [nome] => João Nuno Gonçalves
            [sexo] => 1
            [datanascimento] => 1984-08-13
            [morada] => Rua Elias Garcia Nº325 6D
            [localidade] => Amadora
            [cp1] => 2700
            [cp2] => 323
            [tlm] => 964359799
            [email] => joaoridebmx@yahoo.com
            [estadocivil] => 1
            [profissao] => 7
            [file1] => 103138_cara.jpg
        )

    [3] => Array
        (
            [id] => 103138
            [nome] => João Nuno Gonçalves
            [sexo] => 1
            [datanascimento] => 1984-08-13
            [morada] => Rua Elias Garcia Nº325 6D
            [localidade] => Amadora
            [cp1] => 2700
            [cp2] => 323
            [tlm] => 964359799
            [email] => joaoridebmx@yahoo.com
            [estadocivil] => 1
            [profissao] => 7
            [file1] => 103138_cara.jpg
            [file2] => 103138_corpo.jpg
        )

私の質問は次のとおりです。キー「file1」と「file2」の両方を持つ要素を保持しながら、キー「file1」のみを含む配列要素を削除するにはどうすればよいですか

配列をマージするために使用したコードは次のとおりです。

foreach ($ids as $val1) {
  foreach ($files as $key => $val2) {
    $cara = strpos($val2['file'], $val1['id'].'_cara');
    if ($cara !== false) {
      $val1['file1'] = $val2['file'];
      $data[] = $val1;
      unset($files[$key]);
    }
    $corpo = strpos($val2['file'], $val1['id'].'_corpo');
    if ($corpo !== false) {
      $val1['file2'] = $val2['file'];
      $data[] = $val1;
      unset($files[$key]);
    }
  }
} 
4

4 に答える 4

0

簡単な方法は、おそらくループを実行して、キー 'file1' が存在し、キー 'file2' が存在しないかどうかを確認することです。

foreach ($array as $key => $val) {
    if (isset($val['file1']) && !isset($val['file2'])) {
        unset($array[$key]);
    }
}      
于 2012-08-06T21:30:28.877 に答える
0

試す:

function filter($element) {
    $result = isset($element['file1'], $element['file2']);

    return $result;
}

$out = array_filter($arr3, 'filter');
var_dump($out);

$arr3 は 3 番目の配列です

array_filter はフィルター関数としてメソッドも受け入れます: ex

array_filter($arr3, array('class_name or class instance', 'method_name'));

//編集済み
isset に関する DaveRandom の提案を使用しました

于 2012-08-06T21:21:18.100 に答える
0

元の配列の ID は一意であるように見えるため (それらは ID であり、すべてである)、それらをキーに使用することは理にかなっています。これは、各ファイルが属する要素を簡単に識別できることを意味します。

ID をキーとして配列のインデックスを再作成するのは簡単です。

$data = array();
foreach ($ids as $val) {
  $data[$val['id']] = $val;
}

次に、ファイルを適切なアイテムに関連付けるために必要なことは次のとおりです。

foreach ($files as $file) {

  // First get the ID of the associated item
  $parts = explode('_', $file);
  $id = $parts[0];

  // Now add this file to the correct item
  // Find the next spare file number for this ID
  for ($i = 1; isset($data[$id]['file'.$i]); $i++) {
    continue;
  }
  // ...and add the file
  $data[$id]['file'.$i] = $file;

}

これにより、最初に重複したアイテムが生成されるのを回避できます。また、ネストを回避しforeachます。一般に、これを行っていることに気付いた場合は、何か間違ったことをしています。これは厳密で迅速なルールではありませんが、通常、複数のデータセットの可能な順列を計算する場合にのみ有用であり、正しい方法であり、これはここで行っていることではありません。

ここで、私はあなたが行って作成したことを実行せず、代わりにサブアレイを作成すると言わなければなりfile1ませfile2files。これにより、後でファイルをループするのがはるかに簡単になり、ファイルの次の使用可能な番号を見つけるためのチェックも回避されます。

したがって、2 番目のループを次のようにします。

foreach ($files as $file) {

  // First get the ID of the associated item
  $parts = explode('_', $file);
  $id = $parts[0];

  // Now add this file to the correct item
  if (!isset($data[$id]['files'])) {
    $data[$id]['files'] = array();
  }
  $data[$id]['files'][] = $file;

}
于 2012-08-07T12:30:29.910 に答える
0
foreach ($array as $nr => $values){
  if (isset($values['file1']) && !isset($values['file2']){
        unset($array[$nr]);
  }
}
于 2012-08-06T21:20:21.777 に答える